SSL1662 家庭问题(并查集)

来源:互联网 发布:ts合并软件 安卓版 编辑:程序博客网 时间:2024/06/10 05:06

家庭问题

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二个整数(1≤n≤100)(用空格分隔) 
接下来的k行,每行二个整数(用空格分隔)表示关系 

Output

二个整数(分别表示家庭个数和最大家庭人数)


分析:做一下并查集然后统计。


代码

const
  maxn=100;
var
  a,b:array[0..maxn] of longint;
  f:array[0..maxn] of boolean;
  i,n,k,ans,max,x,y:longint;


function find(x:longint):longint;
begin
  if a[x]=x then exit(x);
  a[x]:=find(a[x]);
  exit(a[x]);
end;


begin
  readln(n,k);
  for i:=1 to n do
    a[i]:=i;
  for i:=1 to k do
    begin
      readln(x,y);
      a[find(x)]:=find(y);
    end;
  for i:=1 to n do
    begin
      if not f[find(i)] then
        begin
          inc(ans);
          f[find(i)]:=true;
        end;
      inc(b[find(i)]);
    end;
  for i:=1 to n do
    if b[i]>max then max:=b[i];
  writeln(ans,' ',max);
end.

0 0