Vijos CoVH之柯南开锁

xiaoxiao2021-02-28  35

题目大意:

OIBH组织的大门有一个很神奇的锁。 锁是由M*N个格子组成, 其中某些格子凸起(灰色的格子)。每一次操作可以把某一行或某一列的格子给按下去。 OIBH组织不是吃素的, 他们的限定次数恰是最少次数. 请您帮助柯南计算出开给定的锁所需的最少次数.

M,N均≤100

题解:

匈牙利算法: 这题,我们分析发现每次要进行操作,肯定要对答案有贡献,所以我们只可能在有灰格的位置的行列进行操作。 然后就很容易了,灭掉第i个,即要灭掉第xi行或第yi列 所以我们可以考虑二分图匹配,将行和列连在一起,做最小点覆盖即可 而有证明可得:最小点覆盖=最大匹配数 所以就裸跑匈牙利即可

代码:

var map:array [0..101,0..101] of boolean; cover:array [0..101] of boolean; link:array [0..101] of longint; ans,i,j,k,n,m:longint; c:char; function find(x:longint):boolean; var q,i:longint; begin for i:=1 to m do if map[x,i] then if not(cover[i]) then begin q:=link[i]; link[i]:=x; cover[i]:=true; if (q=0) or (find(q)) then exit(true); link[i]:=q; end; exit(false); end; begin readln(n,m); for i:=1 to n do begin for j:=1 to m do begin read(c); if c='1' then map[i,j]:=true; end; readln; end; ans:=0; for i:=1 to n do begin fillchar(cover,sizeof(cover),false); if find(i) then inc(ans); end; writeln(ans); end.
转载请注明原文地址: https://www.6miu.com/read-2300078.html

最新回复(0)