题目: | 完美的牛栏 | |
来源: | Usaco 4.2.2 | |
题目大意: | N个奶牛,m个牛栏,每头牛爱好si个牛栏 给出奶牛们的爱好的信息,计算最大分配方案。 | |
数据范围: | N (0 <= N <= 200) 和 M (0 <= M <= 200),0 <= Si <= M | |
样例: |
5 5 2 2 5 3 2 3 4 2 1 5 3 1 2 5 1 2 | 4 |
做题思路: | 网上看到了匈牙利算法,不名头目的就去看了,然后发现大牛的讲解,就链接到这道 题上,结果这道题的题解也可以链接到那个大牛的讲解上,奇特的互联,匈牙利算法 求二分图最大匹配 | |
知识点: | 二分图,最大匹配(匈牙利算法) |
{
ID:Dount Nameless
TASK:stall4
LANG:PASCAL
}
var
a:array[0..1000,0..1000]of boolean;{<存可行的对应关系>}
b:array[0..1000]of boolean;{<存该点是否在增广路上>}
c:array[0..1000]of longint;{<存实际对应关系(有无盖点)>}
n,m,y,i,k,j,ans:longint;
functionpath(x:longint):boolean;{<递归增广路>}
var
i:longint;
begin
for i:=1 to m do
if (a[x,i])and(not b[i]) then{<i不在增广路上,且存在对应关系>}
begin
b[i]:=true;{<把i加入增广路>}
if (c[i]=0)or(path(c[i])) then{<i未存在或者从i的对应项出发有可增广路>}
begin
c[i]:=x;{<修改对应关系>}
exit(true);{返回有增广路<>}
end;
end;
exit(false);{<返回无增广路>}
end;
procedure hungary;
var
i:longint;
begin
fillchar(c,sizeof(c),0);
for i:=1 to n do
begin
fillchar(b,sizeof(b),false);
if path(i) then inc(ans);{<从i的对应项出有增广路则匹配数+1>}
end;
end;
begin
assign(input,'stall4.in');reset(input);
assign(output,'stall4.out');rewrite(output);
fillchar(a,sizeof(a),false);
readln(n,m);
for i:=1 to n do
begin
read(k);
for j:=1 to k do
begin
read(y);
a[i,y]:=true;
end;
readln;
end;
ans:=0;
hungary;{<匈牙利算法>}
writeln(ans);
close(input);close(output);
end.
题目来源:
http://www.nocow.cn/index.php/Translate:USACO/stall4