http://acm.hdu.edu.cn/showproblem.php?pid=1151
在一个城市里有n个地点和k条道路,道路都是单向的,并且不存在环.(DAG)
现在伞兵需要去n个地点视察,伞兵只能沿着路的方向走,问最少需要多少伞兵。
DAG的最小路径覆盖是指找最小数目的互相不相交的有向路径,满足DAG的所有顶点都被覆盖.
首先给出公式:DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数.
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = ;
int n,k;
vector<int>G[];
int link[maxn];
bool vis[maxn]; void add_edge(int u,int v)
{
G[u].push_back(v);
} bool dfs(int u)
{
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(!vis[v])
{
vis[v]=true;
if(link[v]==-||dfs(link[v]))
{
link[v]=u;
return true;
}
}
}
return false;
}
int main()
{
//freopen("a.txt","r",stdin);
int t,b,c;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(int i=;i<n;i++) G[i].clear();
for(int i=;i<k;i++)
{
scanf("%d%d",&b,&c);
add_edge(b-,c-);
}
int ans=;
memset(link,-,sizeof(link));
for(int i=;i<n;i++)
{
memset(vis,,sizeof(vis));
if(dfs(i)) ans++;
}
printf("%d\n",n-ans);
}
return ;
}