版权声明:本文为博主原创文章,未经博主允许不得转载。(除非给钱。。。/贪婪) https://blog.csdn.net/SSL_zeng_yu/article/details/78880958
最大匹配 人员分配
Time Limit:1000MS Memory Limit:65536K
Total Submit:112 Accepted:57
Description
设有M个工人x1, x2, …, xm,和N项工作y1, y2, …, yn,规定每个工人至多做一项工作,而每项工作至多分配一名工人去做。由于种种原因,每个工人只能胜任其中的一项或几项工作。问应怎样分配才能使尽可能多的工人分配到他胜任的工作。这个问题称为人员分配问题。
Input
第一行两个整数m,n分别为工人数和工作数。
接下来一个整数s,为二分图的边数。
接下来s行,每行两个数ai,bi表示第ai个工人能胜任第bi份工作
Output
一个整数,表示最多能让多少个工人派到自己的胜任的工作上。
Sample Input
3 3
4
1 2
2 1
3 3
1 3
Sample Output
3
Hint
规模:
1<=m,n<=100
1<=s<=10000
Source
cwj
-
var map:array[0..101,0..101] of boolean; link:array[0..101] of longint; cover:array[0..101] of boolean; i,j,n,m,s,ans,x,y:longint; function find(i:longint):boolean; var k,q:longint; begin find:=true; for k:=1 to n do if map[i,k] and not(cover[k]) then begin q:=link[k]; link[k]:=i; cover[k]:=true; if (q=0) or find(q) then exit; link[k]:=q; end; find:=false; end; procedure main; var i:longint; begin for i:=1 to n do begin fillchar(cover,sizeof(cover),0); find(i); end; end; begin readln(m,n); readln(s); for i:=1 to s do begin readln(x,y); map[x,y]:=true; end; main; for i:=1 to n do if link[i]<>0 then inc(ans); writeln(ans); end.