3027 - Corporative Network
思路:并查集;
cost记录当前点到根节点的距离,每次合并时路径压缩将cost更新。
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<string.h> 5 #include<math.h> 6 #include<stack> 7 #include<set> 8 #include<queue> 9 using namespace std; 10 int bin[20005]; 11 int du[20005]; 12 char str[20]; 13 int main(void) 14 { 15 int i,j; 16 int n; 17 scanf("%d",&n); 18 while(n--) 19 { 20 int m; 21 scanf("%d",&m); 22 for(i = 1; i <= 20005; i++) 23 bin[i] = i,du[i] = 0; 24 while(scanf("%s",str),str[0]!='O') 25 { 26 int x,y; 27 if(str[0]=='I') 28 { 29 scanf("%d %d",&x,&y); 30 int xx; 31 for(xx = y; bin[xx]!=xx;) 32 { 33 xx = bin[xx]; 34 du[y]+=du[xx]; 35 } 36 bin[y] = xx; 37 bin[x] = xx; 38 du[x] = du[y]+abs(x-y)%1000; 39 } 40 else 41 { int sum = 0; 42 int xx;scanf("%d",&x); 43 for(xx = x; bin[xx]!=xx;) 44 { 45 xx=bin[xx],du[x]+=du[xx]; 46 } 47 bin[x] = xx; 48 printf("%d ",du[x]); 49 } 50 } 51 } 52 return 0; 53 }