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

题意:

派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上,

再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点。点可以重复去

思路:

最小路径覆盖,只是点可以重复去,就需要求传递闭包,用floyd

/* ***********************************************
Author        :devil
Created Time  :2016/5/17 16:45:13
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
const int N=510;
int link[N],n;
bool mp[N][N],vis[N];
bool dfs(int u)
{
    for(int i=1; i<=n; i++)
    {
        if(mp[u][i]&&!vis[i])
        {
            vis[i]=1;
            if(link[i]==-1||dfs(link[i]))
            {
                link[i]=u;
                return 1;
            }
        }
    }
    return 0;
}
void floyd()
{
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(mp[i][j]==0)
                for(int k=1; k<=n; k++)
                    if(mp[i][k]&&mp[k][j])
                    {
                        mp[i][j]=1;
                        break;
                    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int m,x,y;
    while(~scanf("%d%d",&n,&m)&&(n+m))
    {
        memset(link,-1,sizeof(link));
        memset(mp,0,sizeof(mp));
        while(m--)
        {
            scanf("%d%d",&x,&y);
            mp[x][y]=1;
        }
        floyd();
        int ans=0;
        for(int i=1; i<=n; i++)
        {
            memset(vis,0,sizeof(vis));
            ans+=dfs(i);
        }
        printf("%d\n",n-ans);
    }
    return 0;
}
时间: 2024-10-09 01:21:00

POJ2594 Treasure Exploration(最小路径覆盖+传递闭包)的相关文章

POJ2594-Treasure Exploration(最小路径覆盖变形)

题目链接 题意:在一个有向图上,至少放多少个机器人可以遍历整个图(每个顶点可以重复遍历)? 思路:最小路径覆盖的变形,因为点可以重复遍历,所以要用floyd重新建图,然后用最小路径覆盖去做. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; const in

最大匹配、最小顶点覆盖、最大独立集、最小路径覆盖(转)

在讲述这两个算法之前,首先有几个概念需要明白: 二分图: 二分图又称二部图,是图论中的一种特殊模型.设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A, j in B), 则称图G是二分图. 匹配: 给定一个二分图,在G的一个子图G'中,如果G'的边集中的任意两条边都不依附于同一个顶点,则称G'的边集为G的一个匹配 最大匹配: 在所有的匹配中,边数最多的那个匹配就是二分图的最大匹

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

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

POJ 2594 Treasure Exploration【传递闭包+最小路径覆盖】

大意: 有n个点,告诉你一些单向边,问多少条边能把所有的点覆盖[注意点能重复覆盖  比如4->1->2   5->3] 分析: 知识储备: 传递闭包:  所谓传递,可以这么理解,对于节点j如果i能到k并且k能到j那么i能到j,这样用像floyed就能处理出任意两个点能否到达 for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { if(W[i][k]) { for(int j = 1; j <= n; j+

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 2594 Treasure Exploration(最小路径覆盖变形)

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

POJ 2594--Treasure Exploration【二分图 &amp;&amp; 最小路径覆盖 &amp;&amp; 点可以重复走 &amp;&amp; 传递闭包】

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