poj 1422 Air Raid

来源:互联网 发布:js读取本地json文件 编辑:程序博客网 时间:2024/06/09 20:00
/*最小路径覆盖*//*解题思路:开始时,在图上每个结点放上伞兵,然后每次找出一条路径,就意味着可去掉一个伞兵。最少伞兵数=总结点数-能选出的最大边数*/#include<stdio.h>#include<string.h>#define MaxN 125int N,M;int link[MaxN];//记录点匹配的点的编号bool cover[MaxN];//记录点是否被搜索过bool Map[MaxN][MaxN];//邻接矩阵 true代表有边相连bool Find(int i){    int j;    for(j=1;j<=N;++j)        if(Map[i][j] && !cover[j])//如果结点i与j相邻并且未被查找过        {            cover[j]=true;//标记j为已经查找过            if(!link[j]//如果j未在前一个匹配M中|| Find(link[j]))//j在匹配M中,但是从与j相邻的结点出发可以有增广路            {                link[j]=i;//记录查找成功记录                return true;//返回查找成功            }        }return false;}int solve(){    int i,t=0;    memset(link,0,sizeof(link));    for(i=1;i<=N;++i){        memset(cover,false,sizeof(cover));//清空上次搜索时的标记        if (Find(i))//从节点i尝试扩展t++;    }return N-t;}int main(){int test,i,ans,S,E;scanf("%d",&test);while (test--){memset(Map,0,sizeof(Map));scanf("%d%d",&N,&M);for (i=1;i<=M;i++){scanf("%d%d",&S,&E);Map[S][E]=1;}ans=solve();printf("%d\n",ans);}return 0;}

原创粉丝点击