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

题意:
一个人举办聚会,让计算需要几张桌子,认识的人坐在一起,例如:A认识B,B认识C,那么认为A也认识C。
题目链接:
(http://acm.hdu.edu.cn/showproblem.php?pid=1213)
分析:
主要用到并查集。
并查集详细用法:
(http://blog.csdn.net/luomingjun12315/article/details/47373345)
代码如下:

#include 
#include
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[n])
        return n;
    return Find(node[n]);
}
void unite(int x,int y)//合并元素x, y所处的集合  
{
    x=Find(x);
    y=Find(y);
    if(x==y)
        return;
          //判断两棵树的高度,然后在决定谁为子树  
    if(Rank[x]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;iscanf("%d%d",&x,&y);
           unite(x,y);
       }
       int num=0;
       for(int i=1;i<=n;i++)
       {
           if(node[i]==i)
            num++;
       }
       cout<

你可能感兴趣的:(杭电oj,数据结构————并查集)