题目:http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=33982
加权并查集,其实这题就是在普通并查集的基础上增加一个数组d[x], 记录X到根节点的距离。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 20000+10;
int f[maxn],d[maxn];
int find(int x){
if(f[x]!=x){
int root=find(f[x]);
d[x]+=d[f[x]];
return f[x]=root;
}
return x;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,u,v;
char op[10];
scanf("%d",&n);
for(int i=1;i<=n;i++) f[i]=i,d[i]=0;
while( scanf("%s",op)&&op[0]!='O'){
if(op[0]=='E'){ scanf("%d",&u); find(u);printf("%d\n",d[u]); }
if(op[0]=='I'){ scanf("%d%d",&u,&v);f[u]=v; d[u]=abs(u-v)%1000; }
}
}
return 0;
}