您的位置:首页 > 其它

hdu 3635 并查集

2015-07-28 20:26 211 查看
这道题主要还是要怎么判断矛盾,用rank数组保存与父亲节点的奇偶性,0表示相同,1表示不同,添加关系的时候先判断再更新就好了。。#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int father[111111];
int tim[111111],size[111111];
int js=0;
int find(int x)
{
int t;
if(father[x]!=x)
{
t=find(father[x]);
tim[x]=tim[father[x]]+tim[x];//累加转移次数
father[x]=t;
}
return(father[x]);
}
void tran(int a,int b)
{
int x,y;
x=find(a);
y=find(b);
if(x==y) return;
father[x]=y;
size[y]+=size[x];//个数加给父亲
tim[x]+=1;//根节点转移次数加1
}
void query(int a)
{
int t;
t=find(a);
printf("%d %d %d\n",t,size[t],tim[a]);
}
int main()
{
char ch;
int t,n,m,i,j,a,b;
scanf("%d",&t);
while(t--)
{
js++;
printf("Case %d:\n",js);
scanf("%d%d%",&n,&m);
memset(tim,0,sizeof(tim));
for(i=1;i<=n;i++)
{father[i]=i; size[i]=1;}
for(i=1;i<=m;i++)
{
cin>>ch;
if(ch=='T')
{
scanf("%d%d",&a,&b);
tran(a,b);
}
else
{
scanf("%d",&a);
query(a);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: