您的位置:首页 > 其它

hdu 1213 How Many Tables(并查集)

2014-08-06 21:02 260 查看
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int num[1010];
int find(int x){//找父节点
if(x==num[x]) return x;
else num[x]=find(num[x]); //压缩路径
return num[x];
}
void join(int x,int y){//合并
int fx=find(x);
int fy=find(y);
if(fx!=fy){
num[fx]=fy;
}
}
int main(){
int t,n,m,i,j,s,a,b;
scanf("%d",&t);
while(t--){
memset(num,0,sizeof(num));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){//初始化
num[i]=i;
}
for(i=0;i<m;i++){
scanf("%d%d",&a,&b);
join(a,b);//添加
}
for(s=0,i=1;i<=n;i++){
if(i==num[i]) s++;//如果i是num[i]的父节点,则i没有朋友
}
printf("%d\n",s);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: