poj3041 Asteroids

来源:互联网 发布:js购物车数量加减代码 编辑:程序博客网 时间:2024/05/16 02:36

经典的最小点覆盖。对于一个小行星来说,要么清理该行,要么该列时清理掉,所以也就是每个小行星对应的行列中至少选择一样来清理。下面建图,如果我们把每行看成集合一中的点,每列看成集合二中的点,一个小行星看成是其对应行列的连线,那么也就是说不能存在某一条连线两边的点都没有被选中的情况。这恰好就是二分图最小点集覆盖的要求。

varn,k:longint;g:Array[1..500,1..500]of longint;match,t:Array[1..500]of longint;h:Array[1..500]of boolean;procedure init;var i,x,y:longint;beginreadln(n,k);for i:=1 to k dobeginreadln(x,y);inc(t[x]);g[x,t[x]]:=y;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 n dobeginfillchar(h,sizeof(h),0);if(check(i))then inc(ans);end;writeln(ans);end;begininit;hungarian;end.