Codevs2776 寻找代表元

时间:2023-03-10 01:21:49
Codevs2776 寻找代表元

2776 寻找代表元

时间限制: 1 s

 空间限制: 256000 KB
 题目等级 : 黄金 Gold
题目描述 Description

广州二中苏元实验学校一共有n个社团,分别用1到n编号。
广州二中苏元实验学校一共有m个人,分别用1到m编号。每个人可以参加一个或多个社团,也可以不参加任何社团。
每个社团都需要选一个代表。谦哥希望更多的人能够成为代表。

输入描述 Input Description

第一行输入两个数n和m。
以下n行每行若干个数,这些数都是不超过m的正整数。其中第i行的数表示社团i的全部成员。每行用一个0结束。

输出描述 Output Description

输出最多的能够成为代表的人数。

样例输入 Sample Input

4 4
1 2 0
1 2 0
1 2 0
1 2 3 4 0

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

各个测试点1s

数据范围
n,m<=200

分类标签 Tags 点此展开

题解:裸二分图匹配不解释

 type
point=^node;
node=record
g:longint;
next:point;
end;
var
i,j,k,l,m,n:longint;
c,f:array[..] of longint;
a:array[..] of point;
procedure add(x,y:longint);inline;
var p:point;
begin
new(p);
p^.g:=y;
p^.next:=a[x];
a[x]:=p;
end;
function check(x:longint):boolean;inline;
var p:point;
begin
p:=a[x];
while p<>nil do
begin
if f[p^.g]<>i then
begin
f[p^.g]:=i;
if c[p^.g]= then
begin
c[p^.g]:=x;
exit(true);
end
else if check(c[p^.g]) then
begin
c[p^.g]:=x;
exit(true);
end;
end;
p:=p^.next;
end;
exit(false);
end; {$IFDEF WINDOWS}{$R wiki2776.rc}{$ENDIF} begin
readln(n,m);
for i:= to n do
begin
a[i]:=nil;
while not(eoln) do
begin
read(j);
if j= then break;
add(i,j);
end;
readln;
end;
fillchar(c,sizeof(c),);
fillchar(f,sizeof(f),);l:=;
for i:= to n do
if check(i) then inc(l);
writeln(l);
readln;
end.