http://acm.hdu.edu.cn/showproblem.php?pid=1151
题意:有n个路口,m条路(单向、不成环),有一些伞兵降落到路口,求最少数量的伞兵可以访问所有路口
分析:二分图DAG图(无回路有向图)的最小路径覆盖 = 节点数 - 最大匹配数
路径覆盖:在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联。
#include<iostream>
#include<cstring>
#include<cstdio>
const int NM=130;
int a[130][130],link[NM],flag[NM],cross;
int Find(int x)
{
for(int i=1;i<=cross;i++)
{
if(a[x][i]&&!flag[i])
{
flag[i]=1;
if(link[i]==-1||Find(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int T,street,i,ans,x,y;
scanf("%d",&T);
while(T--)
{
memset(a,0,sizeof(a));
memset(link,-1,sizeof(link));
scanf("%d%d",&cross,&street);
for(i=0;i<street;i++)
{
scanf("%d%d",&x,&y);
a[x][y]=1;
}
ans=0;
for(i=1;i<=cross;i++)
{
memset(flag,0,sizeof(flag));
if(Find(i)) ans++;
}
printf("%d\n",cross-ans);
}
return 0;
}