传送门: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;
}