POJ 1962-Corporative Network (并查集)

题目有2种操作, 一种是查询,一种是设置。

设置为将u的父亲设置为v,然后他们之间的距离为|u-v|%1000

查询为该点到根点的距离

用并查集做,做的时候注意维护即可,注意取余操作。

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5 const int N = 200010;
 6 int d[N],F[N];
 7 int init(int x)
 8 {
 9     for(int i =0;i<=x;i++)
10     {
11         F[i] = i;
12         d[i]=0;
13     }
14 }
15 int findset(int x)
16 {
17     if(F[x]!=x)
18     {
19         int root = findset(F[x]);
20         d[x] = d[x]+d[F[x]];
21         return F[x] = root;
22     }
23     else return x;
24 }
25 int main()
26 {
27     int T,n;
28     char s[10];
29     scanf("%d",&T);
30     while(T--)
31     {
32         int n,u,v;
33         scanf("%d",&n);
34         init(n);
35         while(scanf("%s",s) && s[0]!='O')
36         {
37               if(s[0] == 'E')
38               {
39                 scanf("%d",&u);
40                 findset(u);
41                 printf("%d\n",d[u]);
42               }
43               else
44               {
45                   scanf("%d%d",&u,&v);
46                   F[u] = v;
47                   d[u] = abs(u-v)%1000;
48               }
49         }
50     }
51     return 0;
52 }

 

posted on 2015-04-21 15:34  细雨微光  阅读(266)  评论(0)    收藏  举报