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

POJ 1422 Air Raid

2010-11-04 21:07 302 查看
匈牙利算法求最小路径覆盖:在一个有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联;(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次且仅一次);解决此类问题可以建立一个二分图模型。把所有顶点i拆成两个:X结点集中的i和Y结点集中的i',如果有边i->j,则在二分图中引入边i->j',设二分图最大匹配为m,则结果就是n-m

代码:

#include<iostream>
using namespace std;
int g[150][150],u[150],link[150];
int n;
int dfs(int t)
{
int i;
for(i=1;i<=n;i++)
{
if(g[t][i]&&!u[i])
{
u[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=t;
return 1;
}
}
}
return 0;
}
int hungary()
{
int i,num=0;
memset(link,-1,sizeof(link));
for(i=1;i<=n;i++)
{
memset(u,0,sizeof(u));
{
if(dfs(i))
num++;
}
}
return num;
}
int main()
{
int i,j,a,b,k,test;
cin>>test;
while(test--)
{
memset(g,0,sizeof(g));
scanf("%d %d",&n,&k);
for(i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
g[a][b]=1;
}
printf("%d/n",n-hungary());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: