您的位置:首页 > 其它

杭电oj1213——How Many Tables(并查集)

2017-04-25 23:40 781 查看
题意:

一个人举办聚会,让计算需要几张桌子,认识的人坐在一起,例如:A认识B,B认识C,那么认为A也认识C。

题目链接:

(http://acm.hdu.edu.cn/showproblem.php?pid=1213)

分析:

主要用到并查集。

并查集详细用法:

(http://blog.csdn.net/luomingjun12315/article/details/47373345)

代码如下:

#include <iostream>
#include<stdio.h>
using namespace std;
int node[1005];//每个节点
int Rank[1005];//树的高度
void init(int n)//初始化
{
for(int i=1;i<=n;i++)
{
node[i]=i;
Rank[i]=0;
}

}
int Find(int n)//查找当前元素所在树的根节点(代表元素)
{
if(n==node
)
return n;
return Find(node
);
}
void unite(int x,int y)//合并元素x, y所处的集合
{
x=Find(x);
y=Find(y);
if(x==y)
return;
//判断两棵树的高度,然后在决定谁为子树
if(Rank[x]<Rank[y])
{
node[x]=y;
}
else
{
node[y]=x;
if(Rank[x]==Rank[y])
Rank[x]++;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,x,y;
scanf("%d%d",&n,&m);
init(n);
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
unite(x,y);
}
int num=0;
for(int i=1;i<=n;i++)
{
if(node[i]==i)
num++;
}
cout<<num<<endl;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  杭电