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 01 2 01 2 01 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 begin14 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 begin22 p:=a[x];23 while p<>nil do24 begin25 if f[p^.g]<>i then26 begin27 f[p^.g]:=i;28 if c[p^.g]=0 then29 begin30 c[p^.g]:=x;31 exit(true);32 end33 else if check(c[p^.g]) then34 begin35 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 begin47 readln(n,m);48 for i:=1 to n do49 begin50 a[i]:=nil;51 while not(eoln) do52 begin53 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 do62 if check(i) then inc(l);63 writeln(l);64 readln;65 end.66