POJ 2594 Treasure Exploration floyd+最小路径覆盖
http://poj.org/problem?id=2594
题意:N个点组成的有向无环图,每个点可以重复到达,问至少派几个机器人可以走完所有的点,点可以重复到达,
还以为跟1422一模一样呢,还奇怪了,弄两个一样的题,非也。poj 1422的每个点只能走一次,所以用最小
路径覆盖,这个题,每个点可以重复走,用floyd传递闭包,好吧,传递闭包代码好像简单,但是原理还要学的
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int link[505];
bool vis[505],map[505][505];
int n;
bool dfs(int u)
{
for(int i=1;i<=n;i++)
{
if(map[u][i]&&!vis[i])
{
vis[i]=1;
if(!link[i]||dfs(link[i]))
{
link[i]=u;
return 1;
}
}
}
return 0;
}
int MaxMatch()
{
int SUM=0;
memset(link,0,sizeof(link));
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))SUM++;
}
return SUM;
}
int main()
{
int i,j,k,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)break;
memset(map,0,sizeof(map));
while(m--)
{
scanf("%d%d",&i,&j);
map[i][j]=1;
}
//传递闭包
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(map[i][k]&&map[k][j])map[i][j]=1;
int ans=MaxMatch();
printf("%d\n",n-ans);
}
return 0;
}

浙公网安备 33010602011771号