poj2226 Muddy Fields

来源:互联网 发布:做淘宝最少得多钱 编辑:程序博客网 时间:2024/05/17 01:05

这题也是一道经典的最小点覆盖问题,但是注意本题中不是整行整列地消除,而是消除连续的格子,因此先把连续的格子当成一个整体标号,然后当行列相交时连边。

varr,c,nx,ny:longint;s:array[1..50]of string;g,tx,ty:array[1..3000,1..3000]of longint;match,t:array[1..3000]of longint;h:array[1..3000]of boolean;procedure init;var i,j:longint;beginnx:=0;ny:=0;readln(r,c);for i:=1 to r do readln(s[i]);for i:=1 to r dobeginj:=1;while(j<=c)dobeginif(s[i,j]='*')thenbegininc(nx);while(j<=c)and(s[i,j]='*')dobegintx[i,j]:=nx;inc(j);end;dec(j)end;inc(j);end;end;for j:=1 to c dobegini:=1;while(i<=r)dobeginif(s[i,j]='*')thenbegininc(ny);while(i<=r)and(s[i,j]='*')dobeginty[i,j]:=ny;inc(i);end;dec(i);end;inc(i);end;end;for i:=1 to r dofor j:=1 to c dobeginif(s[i,j]='*')thenbegininc(t[tx[i][j]]);g[tx[i][j],t[tx[i][j]]]:=ty[i][j];end;end;end;function check(k:longint):boolean;var i:longint;beginfor i:=1 to t[k] doif(not h[g[k,i]])thenbeginh[g[k,i]]:=true;if(match[g[k,i]]=0)or(check(match[g[k,i]]))thenbeginmatch[g[k,i]]:=k;exit(true);end;end;exit(false);end;procedure hungarian;var i,ans:longint;beginans:=0;for i:=1 to nx dobeginfillchar(h,sizeof(h),0);if(check(i))then inc(ans);end;writeln(ans);end;begininit;hungarian;end.


原创粉丝点击