http://acm.hdu.edu.cn/showproblem.php?pid=1856
题意:求每个人都相互认识(间接或直接)最大的集合。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int NM=10000005;
int father[NM],rank[NM],mmax;
int Find(int x){
/*while(x!=father[x])
x=father[x];
return x; 超时*/
/*if(x!=father[x])
father[x]=Find(father[x]);
return father[x]; 小心爆栈*/
int t,p1=x;
while(p1!=father[p1])
p1=father[p1];
while(x!=p1)
{
t=father[x];
father[x]=p1;
x=t;
}
return p1;
}
void Union(int x,int y)
{
x=Find(x);y=Find(y);
if(x!=y){
father[x]=y;
rank[y]+=rank[x];
if(mmax<rank[y]) mmax=rank[y];
}
}
int main()
{
int m,x,y,i;
while(~scanf("%d",&m)){
for(i=1;i<NM;i++){
father[i]=i;rank[i]=1;
}
mmax=1; //
for(i=0;i<m;i++){
scanf("%d%d",&x,&y);
Union(x,y);
}
printf("%d\n",mmax);
}
return 0;
}