[poj] 1422 Air Raid || 最小路径覆盖
原题
有n个点和m条有向边,现在要在点上放一些伞兵,然后伞兵沿着图走,直到不能走为止
每条边只能是一个伞兵走过,问最少放多少个伞兵
最小路径覆盖棵题,最小路径覆盖=n-最大匹配数
#include<cstdio>
#include<cstring>
#define N 150
using namespace std;
int t,n,m,lover[N],e[N][N],ans;
bool vis[N];
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;
}