题意:给定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 }