UVALive - 3027
并查集水题,需要注意的是这里不能采用寻常的连根模式,而要直接用节点连接其父节点,而每个节点的到根节点的长度在find函数递归的过程中实现。
AC代码:
#include
using namespace std;
const int size=20005;
int fa[size],d[size];
inline int Abs(int x)
{
if(x<0) return -x;
return x;
}
void init(int n)
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
d[i]=0;
}
}
int find(int x)
{
if(x==fa[x])
{
return fa[x];
}
else
{
int temp=find(fa[x]);
d[x]+=d[fa[x]];
return fa[x]=temp;
}
}
void merge(int x,int y)
{
fa[x]=y;
d[x]=Abs(x-y)%1000;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
char op[2];
init(n);
while(scanf("%s",op)&&op[0]!='O')
{
if(op[0]=='E')
{
int x;
scanf("%d",&x);
find(x);
printf("%d\n",d[x]);
}
else{
int u,v;
scanf("%d%d",&u,&v);
merge(u,v);
}
}
}
}