杭电1151 Air Raid

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1151

题意:地图有M个路口和N条有向路;问最少多少人才能走完所有点。

思路:有向无环图的最小路径覆盖数=所有定点-最大匹配;匈牙利算法找最大匹配。

AC代码:

#include<iostream>
#include<cstring>
using namespace std;
bool Map[123][123],vis[123];
int Link[123],M,N;
bool Find(int x)
{
	for(int i=1;i<=M;i++)
	{
		if(!vis[i]&&Map[x][i])
		{
			vis[i]=1;
			if(!Link[i]||Find(Link[i]))
			{
				Link[i]=x;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	cin>>N;
	while(N--)
	{
		memset(Link,0,sizeof(Link));
		memset(Map,0,sizeof(Map));
		int k;
		cin>>M>>k;
		while(k--)
		{
			int a,b;
			cin>>a>>b;
			Map[a][b]=1;
		}
		int ans=0;
		for(int i=1;i<=M;i++)
		{
			memset(vis,0,sizeof(vis));
			if(Find(i)) ans++;
		}
		cout<<M-ans<<endl;
	}
	return 0;
}

           

猜你喜欢

转载自blog.csdn.net/jack_jxnu/article/details/81195956