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

浙公网安备 33010602011771号