POJ 1962

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

你可能感兴趣的:(poj)