[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;
}
posted @ 2017-12-08 16:11  Mrha  阅读(141)  评论(0编辑  收藏  举报