大致思路:并查集,每次合并时都将两个根节点的num值合并,循环一遍找到最大的num值即可。
(一定要注意特殊值,一定要好好读题,切记切记~~)
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define MAX 10000005
int per[MAX];
int num[MAX];
void init()
{
for(int i = 0; i < MAX; i ++)
{
per[i] = i;
num[i] = 1;
}
}
int find(int x)//寻找根节点;
{
int r = x,c = 0;
while(r!= per[r])
{
r = per[r];
}
int i = x,j;
while(i != r)
{
j = per[i];
per[i] = r;
i = j;
}
return r;
}
void join(int x,int y)//合并根节点并将num值相加;
{
int s = find(x);
int e = find(y);
if(s != e)
{
per[s] = e;
num[e] += num[s];
}
}
int main()
{
int n;
while(scanf("%d",&n)!= EOF)
{
if(n==0)
{
printf("1\n");
continue;
}
init();
int a,b;
int maxn = -1,ma = -1;
while(n--)
{
scanf("%d%d",&a,&b);
maxn = max(a,maxn);
maxn = max(b,maxn);
join(a,b);
}
for(int i = 1; i <= maxn; i ++)
{
ma = max(ma,num[i]);
}
printf("%d\n",ma);
}
return 0;
}
如有错误,欢迎指出~