看题请点击:传送门
题目只查询结点到根结点的距离,所以跟结点不能动,但其他的随意。符合并查集的特点。
用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]);
}
}
}
}

本文介绍了一种使用并查集解决特定类型问题的方法。通过记录节点到父节点距离,并在查询时更新到根节点的距离,实现了高效查询节点到根节点的距离。代码示例展示了如何初始化并查集、合并节点及查询距离。
459

被折叠的 条评论
为什么被折叠?



