思路:查询的时候,维护一个距离数组,保存每次改变父节点后,每个节点到根节点的距离。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=20010;
int n,pra[maxn],rank[maxn],dis[maxn],head[maxn];
void init()
{
for(int i=0;i<=n;i++)
{
pra[i]=i;
rank[i]=0;
dis[i]=0;
}
}
int Abs(int x)
{
return x>=0?x:(-x);
}
int find(int u)
{
if(pra[u]==u){dis[u]=0;return u;}
int v=pra[u];
pra[u]=find(pra[u]);
dis[u]+=dis[v];
return pra[u];
}
void unite(int a,int b)
{
pra[a]=b;
}
int main()
{
int t,u,v;
char x;
cin>>t;
while(t--)
{
cin>>n;
init();
while(cin>>x,x!='O')
{
if(x=='I'){cin>>u>>v;unite(u,v);head[u]=v;dis[u]=Abs(u-v)%1000;}
else if(x=='E')
{
cin>>u;
if(pra[pra[u]]!=pra[u])
find(u);
cout<<dis[u]<<endl;
}
}
}
return 0;
}