只有两个点距离的时候才%1000,被这个坑了一下,带权并查集里边算简单的了
#include<stdio.h>
struct node
{
int p,dis;
}num[30005];
int abs(int n)
{
return n>0?n:-n;
}
int find(int n)
{
int item;
if(num[n].p==n)
{
return n;
}
item=find(num[n].p);
num[n].dis+=num[num[n].p].dis;
return num[n].p=item;
}
void move(int a,int b)
{
num[a].p=b;
num[a].dis=abs(a-b)%1000;
}
int main()
{
int n,a,b,t;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
char ques[2];
scanf("%d",&n);
for(int i=0;i<30005;i++)
{
num[i].p=i;
num[i].dis=0;
}
while(1)
{
scanf("%s",&ques);
if(ques[0]=='I')
{
scanf("%d%d",&a,&b);
move(a,b);
}
else if(ques[0]=='E')
{
scanf("%d",&a);
find(a);
printf("%d\n",num[a].dis);
}
else
{
break;
}
}
}
}
}