POJ 1274 题解

mac2022-06-30  78

             表示不提供翻译服务,看起来就费了九牛二虎之力……再加上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] dobegin 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;beginwhile not eof dobeginreadln(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] dobegin 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 dobegin fillchar(cover,sizeof(cover),false); find(i);end;for i:=1 to n+m doif link[i]<>0 then inc(ans);writeln(ans div 2);end;end.

           上面的所有数组理论上开400即可,但是为神马过不了索性看了看讨论有人说500可以过……于是才这么悲剧。不重要的部分就缩进了,总之,完了。

转载于:https://www.cnblogs.com/zjerly/archive/2011/10/14/2212414.html

最新回复(0)