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 点此展开
题解:裸二分图匹配不解释
1 type 2 point=^node; 3 node=record 4 g:longint; 5 next:point; 6 end; 7 var 8 i,j,k,l,m,n:longint; 9 c,f:array[0..1000] of longint; 10 a:array[0..1000] of point; 11 procedure add(x,y:longint);inline; 12 var p:point; 13 begin 14 new(p); 15 p^.g:=y; 16 p^.next:=a[x]; 17 a[x]:=p; 18 end; 19 function check(x:longint):boolean;inline; 20 var p:point; 21 begin 22 p:=a[x]; 23 while p<>nil do 24 begin 25 if f[p^.g]<>i then 26 begin 27 f[p^.g]:=i; 28 if c[p^.g]=0 then 29 begin 30 c[p^.g]:=x; 31 exit(true); 32 end 33 else if check(c[p^.g]) then 34 begin 35 c[p^.g]:=x; 36 exit(true); 37 end; 38 end; 39 p:=p^.next; 40 end; 41 exit(false); 42 end; 43 44 {$IFDEF WINDOWS}{$R wiki2776.rc}{$ENDIF} 45 46 begin 47 readln(n,m); 48 for i:=1 to n do 49 begin 50 a[i]:=nil; 51 while not(eoln) do 52 begin 53 read(j); 54 if j=0 then break; 55 add(i,j); 56 end; 57 readln; 58 end; 59 fillchar(c,sizeof(c),0); 60 fillchar(f,sizeof(f),0);l:=0; 61 for i:=1 to n do 62 if check(i) then inc(l); 63 writeln(l); 64 readln; 65 end. 66