题意:给定n台电脑,初始都是以自己作为中心。然后一些询问,E x,问x距离中心多远。 I x y 建立一条x到y的长度为|x-y|(mod 1000)的边,且使得原来x机群的中心转移到y机群上。
题解:并查集,再额外记录每个点到中心的距离。
View Code
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 const int N=30000; 6 int fa[N],dist[N]; 7 int Find(int x) 8 { 9 if(x==fa[x]) 10 return x; 11 else 12 { 13 int fx=Find(fa[x]); 14 dist[x]=(dist[x]+dist[fa[x]]);//%1000; 15 return fa[x]=fx; 16 } 17 } 18 void makeset(int x,int y) 19 { 20 int fx=Find(x),fy=Find(y); 21 if(fx==fy) 22 return; 23 else 24 { 25 fa[fx]=x; 26 dist[fx]=dist[x]; 27 fa[x]=y; 28 dist[x]=abs(y-x)%1000; 29 } 30 } 31 int main() 32 { 33 int T; 34 for(scanf("%d",&T);T;T--) 35 { 36 int n,x,y; 37 scanf("%d",&n); 38 for(int i=1;i<=n;i++) 39 { 40 fa[i]=i;dist[i]=0; 41 } 42 char s[2]; 43 while(scanf("%s",s),s[0]!='O') 44 { 45 if(s[0]=='E') 46 { 47 scanf("%d",&x); 48 Find(x); 49 printf("%d\n",dist[x]); 50 } 51 else 52 { 53 scanf("%d%d",&x,&y); 54 makeset(x,y); 55 } 56 } 57 } 58 return 0; 59 }