题目大意:有n个节点,初始时每个节点的父亲节点都不存在。有两种操作
I u v:把点节点u的父亲节点设为v,距离为|u-v|除以1000的余数。输入保证执行指令前u没有父亲节点。
E u:询问u到根节点的距离。
分析:并查集加路径压缩。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int maxn=20010; int f[maxn],d[maxn]; int findset(int x) { if(f[x] !=x) { int root=findset(f[x]); d[x]+=d[f[x]]; return f[x]=root; } else return x; } int main() { int T,i,n,u,v; char c[5]; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=1;i<=n;i++){ f[i]=i;d[i]=0;} while(scanf("%s",c) && c[0]!='O') { if(c[0] == 'E') { scanf("%d",&u); findset(u); printf("%d ",d[u]); } if(c[0] == 'I') { scanf("%d %d",&u,&v); f[u]=v;d[u]=abs(u-v)%1000; } } } return 0; }