题目大意:给出n对朋友关系,朋友的朋友就是朋友,问最大的朋友圈有多少人。
解题思路:并查集,多一个计数的数组,初始时,每个人都是个体,为1。归并时累加,查找时不用变动。多一个标记数组,标记那些编号有参与。
ac代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, pre[10000005], t1[100005], t2[100005], cnt[10000005], Max, vis[10000005];
int find(int x)
{
int temp;
if (x != pre[x]){
temp = pre[x];
pre[x] = find(pre[x]);
}
return pre[x];
}
void join(int x, int y)
{
int fx=find(x), fy=find(y);
if (fx != fy){
pre[fy] = fx;
cnt[fx] += cnt[fy];
}
}
int main()
{
while (scanf("%d", &n) != EOF){
memset(vis, 0, sizeof(vis));
for (int i=0; i<n; i++){
scanf("%d%d", &t1[i], &t2[i]);
pre[t1[i]] = t1[i], pre[t2[i]] = t2[i];
cnt[t1[i]] = cnt[t2[i]] = 1;
vis[t1[i]] = vis[t2[i]] = 1;
}
Max = 1;
for (int i=0; i<n; i++)
join(t1[i], t2[i]);
for (int i=1; i<10000005; i++)
if (vis[i])
Max = max(Max, cnt[i]);
printf("%d\n", Max);
}
return 0;
}