LA3027 合作网络
5 #include<iostream> 6 #include<stdio.h> 7 #include<string.h> 8 #include<algorithm> 9 #include<stdlib.h> 10 #include<math.h> 11 #include<queue> 12 #include<vector> 13 #include<map> 14 #define MAXN 20000+10 15 //#define MAXM 20000+5 16 #define oo 9556531 17 #define eps 0.000001 18 #define PI acos(-1.0) 19 #define REP1(i,n) for(int i=0;i<(n);i++) 20 #define REP2(i,n) for(int i=1;i<=(n);i++) 21 using namespace std; 22 23 int p[MAXN]; 24 int d[MAXN]; 25 int n,t; 26 27 void init() 28 { 29 REP2(i,n) 30 { 31 p[i]=i; 32 d[i]=0; 33 } 34 } 35 36 int findx(int x) 37 { 38 // return p[x]==x?0:d[x]+getans(p[x]); 39 if (p[x]!=x) //d[x]任然为0,不需要更新 40 { 41 int px=findx(p[x]);//压缩栈,保证前面的根节点已经更新过 42 d[x]=d[x]+d[p[x]];//保证d[p[x]]已经是p[x]到根节点的距离 43 // cout<<"px="<<px<<","<<"d[x]="<<d[x]<<endl; 44 return p[x]=px;//在所有的d更新完毕后,把x连接到根节点px上 45 }else return x; 46 } 47 48 int main() 49 { 50 cin>>t; 51 for(;t;t--) 52 { 53 scanf("%d\n",&n); 54 init(); 55 char Q[20]; 56 while(cin>>Q) 57 { 58 // cout<<"Q="<<Q<<endl; 59 if (Q[0]=='O') break; 60 if (Q[0]=='E')//多次询问E,动态更新 61 { 62 int x;cin>>x; 63 int px=findx(x); 64 cout<<d[x]<<endl; 65 } 66 if (Q[0]=='I') 67 { 68 int i,j; 69 cin>>i>>j; 70 d[i]=abs(i-j)%1000;//d[i]:i到父节点的距离,注意取模 71 p[i]=j;//i的父节点是j 72 } 73 } 74 } 75 return 0; 76 }