码迷,mamicode.com
首页 > 其他好文 > 详细

POJ2594 Treasure Exploration【二分图最小路径覆盖】【Floyd】

时间:2015-04-07 19:40:57      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=2594


题目大意:

给你N个地点,M条有向边,已知构成的图是有向无环图。现在要在地点上放机器人通过M

条边来遍历N个地点,问:最少需要多少个机器人可以遍历N个地点。


思路:

这是一道求最小路径覆盖的题目。和一般最小路径覆盖的题目不一样的地方是:这里的点可

以重复遍历。也就是可以有两个及以上的机器人经过同一个点。 那么,先建立一个二分图,

两边都为N个地点。然后在原图的基础上,用Floyd求一次传递闭包,也就是如果点i可以到达

点j,而点j可以到达点k,那么可以当做点i可以直接跳过点j而到达点k,就可以建立一条有向

(i,k)。建好图后,就是一般的二分图最小路径覆盖的问题了。而二分图最小路径覆盖 = 

点数 - 二分图最大匹配,用匈牙利算法求出二分图最大匹配就可以了。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 550;

bool Map[MAXN][MAXN],Mask[MAXN];
int NX,NY;
int cx[MAXN],cy[MAXN];

void Floyd(int N)       //求传递闭包
{
    for(int k = 1; k <= N; ++k)
    {
        for(int i = 1; i <= N; ++i)
        {
            for(int j = 1; j <= N; ++j)
            {
                if(i != j && Map[i][k] && Map[k][j])
                    Map[i][j] = 1;
            }
        }
    }
}

int FindPath(int u)
{
    for(int i = 1; i <= NY; ++i)
    {
        if(Map[u][i] && !Mask[i])
        {
            Mask[i] = 1;
            if(cy[i] == -1 || FindPath(cy[i]))
            {
                cy[i] = u;
                cx[u] = i;
                return 1;
            }
        }
    }
    return 0;
}

int MaxMatch()  //二分图最大匹配
{
    for(int i = 1; i <= NX; ++i)
        cx[i] = -1;
    for(int i = 1; i <= NY; ++i)
        cy[i] = -1;

    int res = 0;
    for(int i = 1; i <= NX; ++i)
    {
        if(cx[i] == -1)
        {
            for(int j = 1; j <= NY; ++j)
                Mask[j] = 0;
            res += FindPath(i);
        }
    }
    return res;
}

int main()
{
    int N,M,u,v;
    while(~scanf("%d%d",&N,&M) && (N||M))
    {
        memset(Map,0,sizeof(Map));
        for(int i = 1; i <= M; ++i)
        {
            scanf("%d%d",&u,&v);
            Map[u][v] = 1;
        }
        Floyd(N);
        NX = NY = N;
        printf("%d\n",N - MaxMatch());
    }

    return 0;
}


POJ2594 Treasure Exploration【二分图最小路径覆盖】【Floyd】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/44924713

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!