最后会有几个“朋友圈子”,求最大的朋友圈的人数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int r[30005];
int x[30010];
int init(int n)/// 初始化
{
for(int i=1;i<=n;i++)
r[i]=i;
}
int find_(int x) ///寻找根
{
int n=x,t;
while(r[x]!=x)
x=r[x];
while(n!=r[n]){ /// 路径压缩 路过的点全部指向根
t=r[n];
r[n]=x;
n=r[n];
}
return x;
}
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int n,m,i,T,a,b;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
init(n);
while(m--){
scanf("%d%d",&a,&b);
int aa=find_(a);
int bb=find_(b);
if(aa!=bb)/// 合并
r[aa]=bb;
}
memset(x,0,sizeof(x));
for(i=1;i<=n;i++)
x[find_(i)]++;/// 哈希,在一个朋友圈里,则find_(i)相同, 累加
int ans=0;
for(i=1;i<=n;i++)
if(ans<x[i]) ans=x[i]; /// 找到最大的人数
///sort(x+1,x+n+1,cmp); ///或者直接排序,则a[1]即为最大的数
printf("%d\n",ans);
}
return 0;
}
原文:http://blog.csdn.net/u014705854/article/details/41126493