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;
}

  

  

posted @ 2012-02-21 23:19  快乐.  阅读(166)  评论(0编辑  收藏  举报