题目大意:
一个有向图中, 有若干条连接的路线, 问最少放多少个机器人,可以将整个图上的点都走过。 最小路径覆盖问题。
分析:
这时最小路径覆盖问题, 最小路径覆盖 = |V| - 最大匹配数。 (有关最小路径覆盖,最大匹配问题,相关概念不懂得点这里) 当然做这道题还有一个坑!! 如果有向图的边有相交的情况,那么就不能简单的对原图求二分匹配了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<limits.h>
#include<algorithm>
using namespace std;
#define maxn 505
int n,m,sum;
int ans[maxn];
int map[maxn][maxn];
int v[maxn];
void find()
{
int i,j,k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
if(map[i][k]==1)
{
for(j=1;j<=n;j++)
if(map[k][j]==1)
map[i][j]=1;
}
}
}
}
int dfs(int x)//寻找增广路径
{
for(int i=1;i<=n;i++)
{
if(map[x][i]==1 && v[i]==0)
{
v[i]=1;
if(ans[i]==0 || (ans[i]!=0 && dfs(ans[i])==1))
{
ans[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m),(n!=0 || m!=0))
{
memset(ans,0,sizeof(ans));
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=1;
}
find();
sum=0;
for(int i=1;i<=n;i++)
{
memset(v,0,sizeof(v));
int t=dfs(i);
if(t)
sum++;
}
printf("%d\n",n-sum);
}
}