题意:给你两个数代表这两个人是朋友,朋友的朋友还是朋友~~,问这些人组成的集合里面人最多的是多少。。。
思路:属于并查集了,我用的是带路径压缩的,一个集合里面所有元素(除了根节点)的父节点都是根节点,最后统计下哪个根节点出现的次数最多就OK了~~
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <algorithm>
using namespace std;
const int MAXN = 1e5 + 3;
int pre[MAXN]; //存放父节点的数组
int cnt[10000000+3]={0}; //利用下标代表根节点,值代表出现的次数~
int Find(int x)
{
int r = x;
while(pre[r] != r)
{
r = pre[r];
}
int i = x,j;
while(pre[i] != r)
{
j = i;
i = pre[i];
pre[j] = r;
}
return r;
}
void Mix(int a,int b)
{
int x = Find(a);
int y = Find(b);
if(x > y)
{
pre[x] = y;
}
if(x < y)
{
pre[y] = x;
}
}
int mycmp(int a, int b)
{
return a > b;
}
void Mst()
{
for(int i = 1; i <= MAXN; i++)
{
pre[i] = i;
}
}
int main()
{
int N;
while(~scanf("%d",&N))
{
Mst();
memset(cnt,0,sizeof(cnt));
while(N--)
{
int boyf,boys;
scanf("%d%d",&boyf,&boys);
Mix(boyf,boys);
}
for(int i = 1;i <= MAXN;i++){
Find(i); //最后要路径压缩,使得所有的节点都指向根节点。。
cnt[pre[i]] ++; //用来存放根节点出现的次数的数组
}
int ans = 0;
for(int i = 1;i <= MAXN;i++){//找出最大的
if(cnt[i] > ans)
ans = cnt[i];
}
cout << ans <<endl;
}
return 0;
}