题目大意很简单,按照命令连接节点,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 }