并查集的应用。
在压缩路径的时候维护一个dist数组,保存其到祖先的长度。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int uset[21000],dist[21000];
int abs(int a)
{
return a>0?a:-a;
}
bool init()
{
int i;
for (i=0; i<21000; i++)
uset[i]=i;
memset(dist,0,sizeof(dist));
return true;
}
int root(int x)
{
int t;
if (uset[x] == x)
return x;
t=root(uset[x]);
dist[x]+=dist[uset[x]];
return uset[x]=t;
}
int main()
{
int prob,n,t1,t2,op;
char tc;
scanf("%d",&prob);
while (prob--)
{
init();
scanf("%d",&op);
while (true)
{
scanf("%*c%c",&tc);
if (tc == 'E')
{
scanf("%d",&t1);
root(t1);
printf("%d\n",dist[t1]);
}
else if (tc == 'I')
{
scanf("%d%d",&t1,&t2);
uset[t1]=t2;
dist[t1]=abs(t2-t1)%1000;
}
else
break;
}
}
}
本文介绍了一种使用并查集进行路径压缩的方法,并通过一个具体的实现案例来展示如何维护节点到祖先的距离。该方法利用了dist数组保存节点到根节点的路径长度,通过更新这些值来优化查询效率。
365

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



