POJ 1274 题解

             表示不提供翻译服务,看起来就费了九牛二虎之力……再加上POJ猥琐的多组数据,再加上EOF出错,再加上数据范围出错,于是我很无语的直接上题解。

             因为一个牛只能住一个棚,一个棚只能装一个牛,所以牛和棚就构成了二分图的两个集合。一个牛可以住进不同的棚,一个棚可以装不同的牛,其实我们连上边就好……让最多的牛住进最多的棚,最多棚装最多的牛,于是我们就求其最大匹配……(感觉十分啰嗦)。注意连好牛和棚之间的边……

程序:

ContractedBlock.gif ExpandedBlockStart.gif 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可以过……于是才这么悲剧。不重要的部分就缩进了,总之,完了。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值