标签:
问题描述:
求出点到根的距离,带权并查集。
代码思路:
在 I 命令的执行过程中,并不路径压缩。
当执行 E 查询命令时在路径压缩的同时递归求解存储在dist数组里面。
代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define MOD 1000
#define MAX 20000
int pre[MAX+7],dist[MAX+7];
int find(int x)
{
int r=x;
while(r!=pre[r])
r=pre[r];
if(x==r)
dist[x]=0;
else
dist[x]=dist[x]+find(pre[x]);
int i=x,j;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return dist[x];
}
void mix(int x,int y)
{
pre[x]=y;
}
int main()
{
int n,T;
char c;
while(scanf("%d",&T)!=EOF)
{
while(T--)
{
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
pre[i]=i;
while(1)
{
c=getchar();
if(c==‘I‘)
{
int x,y;
scanf("%d%d",&x,&y);
getchar();
dist[x]=abs(x-y)%MOD;
mix(x,y);
}
else if(c==‘E‘)
{
int x;
scanf("%d",&x);
getchar();
printf("%d\n",find(x));
}
else break;
}
}
}
return 0;
}
UVALive 3027 Corporative Network(并查集之四)
标签:
原文地址:http://www.cnblogs.com/burning-flame/p/4941160.html