- Description
有n个人,编号分别为1,2,…n,另外还知道存在k个关系。一个关系的表达为二元组(α,β)形式,表示α,β为同一家庭的成员。
问题:当n,k和k个关系给出之后,求出其中共有多少个家庭、最大的家庭中有多少人。
例如:
n=6,k=3,三个关系为:(1,2),(1,3),(4,5)
此时,6个人组成三个家庭,
即:{1,2,3}为一个家庭,{4,5}为一个家庭,{6}单独为一个家庭,第一个家庭的人数最多。
- Input
第一行为n,k二个整数(0≤n≤100)(用空格分隔),接下来的k行,每行二个整数(用空格分隔)表示关系
- Output
二个整数(分别表示家庭个数和最大家庭人数)
- Sample Input
6 3
1 2
1 3
4 5
- Sample Output
3 3
#include<iostream>
using namespace std;
#define Minn(x,y) ((x)<(y)?(x):(y))
#define Maxx(x,y) ((x)>(y)?(x):(y))
int father[102];
int search(int i)
{
int r,l;
for(r=i;r!=father[r];r=father[r]);
l=i;
if(i!=r)
while(father[i]!=r)
{
l=father[i];
father[i]=r;
i=l;
}
return r;
}
void link(int a,int b)
{
int x=search(a),y=search(b);
int min,max;
min=Minn(x,y);
max=x+y-min;
father[max]=min;
}
int main()
{
int n,k,i,x,y,cou=1,visit[102]={1,0},cc[102]={0},mm;
cin>>n>>k;
for(i=0;i<n;i++)
father[i]=i;
for(i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
link(x,y);
}
for(i=0;i<n;i++)
search(i);
for(i=0;i<n;i++)
{
if(!visit[father[i]])
{
cou++;
visit[father[i]]=1;
}
cc[father[i]]++;
}
mm=-1;
for(i=0;i<n;i++)
{
if(cc[i]>mm)
mm=cc[i];
}
cout<<cou<<" "<<mm<<endl;
return 0;
}