poj1422 Air Raid

来源:互联网 发布:wind资讯经济数据终端 编辑:程序博客网 时间:2024/05/22 00:13

本题若读懂题目就会发现是一道最短路径覆盖的裸题,之后先把无向图转化为二分图,然后再用匈牙利算法求出其最大匹配数,最后最短路径覆盖数就是n-最大匹配数。

建图方法:先拆点,将每个点分为两个点,左边是1到n个点,右边也是1到n个点,然后每一条有向边对应左边的点指向右边的点即可

const MAXN=120;vartc,n,m:longint;g:array[1..MAXN,1..MAXN]of longint;match,t:array[1..MAXN]of longint;h:array[1..MAXN]of boolean;procedure init;var i,x,y:longint;beginfillchar(match,sizeof(match),0);fillchar(t,sizeof(t),0);read(n);read(m);for i:=1 to m dobeginread(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(n-ans);end;beginreadln(tc);while(tc<>0)dobegindec(tc);init;hungarian;end;end.