POJ 1274 题解
表示不提供翻译服务,看起来就费了九牛二虎之力……再加上POJ猥琐的多组数据,再加上EOF出错,再加上数据范围出错,于是我很无语的直接上题解。
因为一个牛只能住一个棚,一个棚只能装一个牛,所以牛和棚就构成了二分图的两个集合。一个牛可以住进不同的棚,一个棚可以装不同的牛,其实我们连上边就好……让最多的牛住进最多的棚,最多棚装最多的牛,于是我们就求其最大匹配……(感觉十分啰嗦)。注意连好牛和棚之间的边……
程序:
View Code
var
map:array[1..500,1..500] of longint; {邻接表}
v:array[1..500] of longint; {邻接表数组}
link:array[1..500] of longint; {二分图匹配}
cover:array[1..500] of boolean; {二分图匹配}
ans,i,j,n,m,x:longint;
function find(i:Longint):boolean;
var
k,q,m:longint;
begin
find:=true;
for m:=1 to v[i] do
begin
k:=map[i,m];
if 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;
end;
find:=false;
end;
begin
while not eof do
begin
readln(n,m);
fillchar(v,sizeof(v),0);
fillchar(map,sizeof(map),0);
ans:=0;
for i:=1 to n do {注意构图}
begin
read(v[i]);
for j:=1 to v[i] do
begin
read(x);
map[i,j]:=x+n;
inc(v[x+n]);
map[x+n,v[x+n]]:=i;
end;
readln;
end;
fillchar(link,sizeof(link),0);
for i:=1 to n+m do
begin
fillchar(cover,sizeof(cover),false);
find(i);
end;
for i:=1 to n+m do
if link[i]<>0 then inc(ans);
writeln(ans div 2);
end;
end.
上面的所有数组理论上开400即可,但是为神马过不了索性看了看讨论有人说500可以过……于是才这么悲剧。不重要的部分就缩进了,总之,完了。