HDU ACM 1856 More is better->并查集

来源:互联网 发布:手机挖币软件 编辑:程序博客网 时间:2024/05/16 19:03

解析:又是一个并查集。

1、题意:王老师需要一些男生帮他做事。要求男生之间都是朋友关系,可以直接的,也可以间接地。最多可以挑选出几个男生(最少挑一个)?
2、并查集,求所有集合中最大集合的元素个数。

3、要注意一个地方是:当n=0时,要输出1。


#include<iostream>   #include<algorithm>using namespace std;int p[10000001],num[10000001];bool Init(int n)                //一开始指向自己{for(int i=0;i<=10000000;i++){p[i]=i;num[i]=1;               //一开始每个集合都只有一个元素}return true;}int Find(int x)            //找到根节点{int r,i,j;r=x;while(r!=p[r]) r=p[r];      //路径压缩准备,找到根节点i=x;while(i!=p[i]){j=p[i];p[i]=r;i=j;}return i;                 //返回根节点}bool Merge(int x,int y)      //返回是否需要合并{int tx,ty;tx=Find(x);ty=Find(y);if(tx==ty) return false;p[tx]=ty;num[ty]+=num[tx];              //合并集合元素个数return true;}int main()  { int n,a,b,max,i,maxnum;while(scanf("%d",&n)==1){Init(n);maxnum=0;for(i=0;i<n;i++){scanf("%d%d",&a,&b);maxnum=maxnum>a?maxnum:a;maxnum=maxnum>b?maxnum:b;Merge(a,b);}max=1;              //注意0个时也为1for(i=1;i<=maxnum;i++)if(max<num[i])max=num[i];printf("%d\n",max);;}    return 0;  }


0 0
原创粉丝点击