题目大意:
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.