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

来源:互联网 发布:手机淘宝怎样更新版本 编辑:程序博客网 时间:2024/05/22 16:45

题意:
一个人举办聚会,让计算需要几张桌子,认识的人坐在一起,例如: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[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]<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;   }}
0 0
原创粉丝点击