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

[poj] 1422 Air Raid || 最小路径覆盖

2017-12-08 16:11 381 查看

原题

有n个点和m条有向边,现在要在点上放一些伞兵,然后伞兵沿着图走,直到不能走为止
每条边只能是一个伞兵走过,问最少放多少个伞兵

最小路径覆盖棵题,最小路径覆盖=n-最大匹配数

#include<cstdio>
#include<cstring>
#define N 150
using namespace std;
int t,n,m,lover
,e

,ans;
bool vis
;

int read()
{
int ans=0,fu=1;
char j=getchar();
for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
if (j=='-') j=getchar(),fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}

bool find(int x)
{
for (int i=1;i<=n;i++)
{
if (e[x][i] && !vis[i])
{
vis[i]=1;
if (!lover[i] || find(lover[i]))
{
lover[i]=x;
return 1;
}
}
}
return 0;
}

int main()
{
t=read();
while (t--)
{
ans=0;
n=read();
m=read();
memset(e,0,sizeof(e));
memset(lover,0,sizeof(lover));
for (int i=1,a,b;i<=m;i++)
{
a=read();
b=read();
e[a][b]=1;
}
for (int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if (find(i)) ans++;
}
printf("%d\n",n-ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: