POJ2594:Treasure Exploration(Floyd + 最小路径覆盖)

Treasure Exploration

Time Limit: 6000MS   Memory Limit: 65536K
Total Submissions: 9794   Accepted: 3975

题目链接http://poj.org/problem?id=2594

Description:

Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? If you never have such experiences, you would never know what fun treasure exploring brings to you.
Recently, a company named EUC (Exploring the Unknown Company) plan to explore an unknown place on Mars, which is considered full of treasure. For fast development of technology and bad environment for human beings, EUC sends some robots to explore the treasure.

To make it easy, we use a graph, which is formed by N points (these N points are numbered from 1 to N), to represent the places to be explored. And some points are connected by one-way road, which means that, through the road, a robot can only move from one end to the other end, but cannot move back. For some unknown reasons, there is no circle in this graph. The robots can be sent to any point from Earth by rockets. After landing, the robot can visit some points through the roads, and it can choose some points, which are on its roads, to explore. You should notice that the roads of two different robots may contain some same point.

For financial reason, EUC wants to use minimal number of robots to explore all the points on Mars.

As an ICPCer, who has excellent programming skill, can your help EUC?

Input:

The input will consist of several test cases. For each test case, two integers N (1 <= N <= 500) and M (0 <= M <= 5000) are given in the first line, indicating the number of points and the number of one-way roads in the graph respectively. Each of the following M lines contains two different integers A and B, indicating there is a one-way from A to B (0 < A, B <= N). The input is terminated by a single line with two zeros.

Output:

For each test of the input, print a line containing the least robots needed.

Sample Input:

1 0
2 1
1 2
2 0
0 0

Sample Output:

1
1
2

题意

问有向图里,需要最少多少个机器人,能走遍所有的点,并且可以走其它机器人已经走过的路径。

题解:

这道题我一开始以为就是最小路径覆盖,结果一直WA...

但其实这题和最小路径覆盖有区别,最小路径覆盖的要求就是在图中找尽量少的路径,让每个节点恰好在一条路径上,单独的一个结点也可以作为一条路径。但是,正是因为每个结点在一条路径上,所以没有重复的路径。

但是这题路径是可以重复的,所以可以利用floyd传递闭包,让原来被“阻断”的路径可以链接起来。

推荐一下这篇博客,挺好的,讲的挺详细的:https://www.cnblogs.com/justPassBy/p/5369930.html

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define mem(x) memset(x,0,sizeof(x))
using namespace std;

const int N = 505 ;
int map[N][N],check[N<<1],match[N<<1],link[N][N<<1];
int n,m,ans;

inline int dfs(int x){
    for(int i=n+1;i<=2*n;i++){
        if(link[x][i] && !check[i]){
            check[i]=1;
            if(!match[i] || dfs(match[i])){
                match[i]=x;
                return 1;
            }
        }
    }
    return 0;
}

int main(){
    while(scanf("%d%d",&n,&m)){
        if(!n && !m) break ;
        mem(map);mem(match);mem(link);ans=0;
        for(int i=1,x,y;i<=m;i++){
            scanf("%d%d",&x,&y);
            map[x][y]=1;
        }
        for(int k=1;k<=n;k++){
            for(int i=1;i<=n;i++){
                if(map[i][k])
                for(int j=1;j<=n;j++){
                    if(map[k][j]) map[i][j]=1;
                }
            }
        }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                if(map[i][j]) link[i][j+n]=1;
        for(int i=1;i<=n;i++){
            mem(check);
            if(dfs(i)) ans++;
        }
        printf("%d\n",n-ans);
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/heyuhhh/p/9932725.html

时间: 2024-11-10 09:06:45

POJ2594:Treasure Exploration(Floyd + 最小路径覆盖)的相关文章

POJ2594 Treasure Exploration(最小路径覆盖+传递闭包)

题意: 派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上, 再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点.点可以重复去. 思路: 最小路径覆盖,只是点可以重复去,就需要求传递闭包,用floyd /* *********************************************** Author :devil Created Time :2016/5/17 16:45:13 *****************************

POJ 2594 —— Treasure Exploration——————【最小路径覆盖、可重点、floyd传递闭包】

Treasure Exploration Time Limit:6000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2594 Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploratio

POJ 2594 Treasure Exploration(最小路径覆盖变形)

POJ 2594 Treasure Exploration 题目链接 题意:有向无环图,求最少多少条路径能够覆盖整个图,点能够反复走 思路:和普通的最小路径覆盖不同的是,点能够反复走,那么事实上仅仅要在多一步.利用floyd求出传递闭包.然后依据这个新的图去做最小路径覆盖就可以 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using names

poj 2594 Treasure Exploration(最小路径覆盖/二分最大匹配)

Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 7208   Accepted: 2944 Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored

poj 2594 Treasure Exploration(最小路径覆盖,可重点)

题意:选出最小路径覆盖图中所有点,路径可以交叉,也就是允许路径有重复的点. 分析:这个题的难点在于如何解决有重复点的问题-方法就是使用Floyd求闭包,就是把间接相连的点直接连上边,然后就是求最小路径覆盖了.我来大概解释一下为什么是对的,首先我们要明确,当我们重复利用一个点的时候,一定是有两个比较良好的路径相交了,而二分图是不允许这样的情况存在的,因为那必然存在了一个点有一个以上的出度或者入度了,而怎么避免这个问题呢,看下面的图: 这就是针对这个问题的一个典型的模型,如果使用正常二分图,求得的匹

POJ 3216 Repairing Company【Floyd + 最小路径覆盖】

大意: 有n个任务,每个任务有三个属性:所在街区,最晚开始时间,执行需要时间 告诉你一个矩阵代表街区间到达时间 告诉你每个任务的三个属性 问最少需要多少人去完成所有任务 分析: floyd处理处任意两个街区的到达时间 拆点   左边集合为n个任务    右边集合跟左边相同 i任务能够到达j任务就从左集合引一条边到右集合 求最小路径覆盖 最小路径覆盖 = n - 最大匹配 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include

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

题目链接: http://poj.org/problem?id=2594 题目大意: 给你N个地点,M条有向边,已知构成的图是有向无环图.现在要在地点上放机器人通过M 条边来遍历N个地点,问:最少需要多少个机器人可以遍历N个地点. 思路: 这是一道求最小路径覆盖的题目.和一般最小路径覆盖的题目不一样的地方是:这里的点可 以重复遍历.也就是可以有两个及以上的机器人经过同一个点. 那么,先建立一个二分图, 两边都为N个地点.然后在原图的基础上,用Floyd求一次传递闭包,也就是如果点i可以到达 点j

POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]

Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 8301   Accepted: 3402 Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored

POJ Treasure Exploration 【DAG交叉最小路径覆盖】

传送门:http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 9802   Accepted: 3979 Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure e