您的位置:首页 > 理论基础 > 计算机网络

LA 3027 合作网络(并查集)(训练指南)

2013-04-17 18:26 260 查看
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4075
I u v:把u的父亲结点设为v,距离为|u-v|%1000.输入保证执行指令前u没有父节点。
E u:询问u到根结点的距离。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn =20000+10;
int pa[maxn],d[maxn];
int findset(int x)///路径压缩,同时维护d[i]:结点i到树根的距离
{
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;
scanf("%d",&T);
while(T--)
{
int n,u,v;
scanf("%d",&n);
for(int i=1;i<=n;i++)///初始化
pa[i]=i,d[i]=0;
char m[9];
while(scanf("%s",m)&&m[0]!='O')
{
if(m[0]=='E')
{
scanf("%d",&u);
findset(u);
printf("%d\n",d[u]);
}
else
{
scanf("%d%d",&u,&v);
pa[u]=v;
d[u]=abs(u-v)%1000;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: