LA3027(并查集)

题目大意很简单,按照命令连接节点,findset函数写的时候费了点劲儿,要注意那个累加距离值。

其实因为刚开始学,还是对并查集的查询和连接不是很熟悉,多推几次就好了。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 int set[20010],p[20010];
 6 int findset(int x)
 7 {
 8     int ans;
 9     if(set[x]==x)
10         return x;
11     else
12     {
13         ans=findset(set[x]);
14         p[x]+=p[set[x]];
15         return set[x]=ans;
16     }
17 }
18 int main()
19 {
20     int T,i;
21     scanf("%d",&T);
22     while(T--)
23     {
24         int n,u,v;
25         scanf("%d",&n);
26         for(int i=0;i<n;i++)
27         {
28             set[i]=i;p[i]=0;
29         }
30         char s[10];
31         while(scanf("%s",s)&&s[0]!='O')
32         {
33             if(s[0]=='I')
34             {
35                 scanf("%d%d",&u,&v);
36                 set[u]=v;
37                 p[u]=(abs(u-v)%1000);
38             }
39             else
40             {
41                 scanf("%d",&u);findset(u);
42                 printf("%d
",p[u]);
43             }
44         }
45     }
46     return 0;
47 }
原文地址:https://www.cnblogs.com/Acgsws/p/3221613.html