您的位置:首页 > 大数据 > 人工智能

hdu1151 Air Raid (最小路径覆盖)

2013-08-10 12:07 453 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151

最小路径覆盖=|N|-最大匹配数用尽量少的不相交简单路径覆盖有向无环图G的所有结点。解决此类问题可以建立一个二分图模型。把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则在二分图中引入边i->j',设二分图最大匹配为m,则结果就是n-m。

#include <stdio.h>
#include <string.h>
#define MAXN 122

int map[MAXN][MAXN];
int from[MAXN],used[MAXN];
//二分图的最小路径覆盖=|N|-最大匹配数
int match(int x,int n)//匈牙利算法
{
int i;
for(i=1;i<=n;++i)
{
if(!used[i]&&map[x][i])
{
used[i]=1;
if(from[i]==-1||match(from[i],n))
{
from[i]=x;
return 1;
}
}
}
return 0;
}

int main()
{
int k,n,m,sum,i,j,test;
scanf("%d",&test);
while(test--)
{
memset(map,0,sizeof(map));
memset(from,-1,sizeof(from));
sum=0;
scanf("%d %d",&n,&m);
for(k=0;k<m;++k)
{
scanf("%d %d",&i,&j);
map[i][j]=1;
}
for(i=1;i<=n;++i)
{
memset(used,0,sizeof(used));
if(match(i,n))
++sum;
}
printf("%d\n",n-sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: