Codevs2776 寻找代表元

时间:2022-05-07
本文章向大家介绍Codevs2776 寻找代表元,主要内容包括2776 寻找代表元、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

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