解析:又是一个并查集。
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个时也为1 for(i=1;i<=maxnum;i++) if(max<num[i]) max=num[i]; printf("%d\n",max);; } return 0; }
时间: 2024-12-25 10:39:17