LA 3027 - Corporative Network
看题请点击:传送门
题目只查询结点到根结点的距离,所以跟结点不能动,但其他的随意。符合并查集的特点。
用d[i]记录到父结点的距离,在查询时更新为到根结点的距离就好了。
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN=20000+10; int pa[MAXN],d[MAXN]; int findset(int x) { if(pa[x]!=x) { int root=findset(pa[x]); d[x]+=d[ pa[x] ]; return pa[x]=root; } else return x; } int main() { int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); memset(d,0,sizeof(d)); for(int i=0;i<n;i++) pa[i]=i; char action[8]; int u,v; while(scanf("%s",action),action[0]!='O') { if(action[0]=='I') { scanf("%d%d",&u,&v); pa[u]=v; d[u]=abs(u-v)%1000; } else { scanf("%d",&u); findset(u); printf("%d\n",d[u]); } } } }
新 blog : www.hrwhisper.me