poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)

  1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdio>
 5 #define N 505
 6 using namespace std;
 7
 8 int g[N][N];
 9 int n, m;
10 int vis[N], linker[N];
11 bool dfs(int u){
12    for(int i=1; i<=n; ++i)
13       if(g[u][i] && !vis[i]){
14           vis[i]=1;
15           if(!linker[i] || dfs(linker[i])){
16               linker[i]=u;
17               return true;
18           }
19       }
20    return false;
21 }
22
23 int main(){
24    while(scanf("%d%d", &n, &m) && (n||m)){
25        memset(g, 0, sizeof(g));
26        while(m--){
27           int u, v;
28           scanf("%d%d", &u, &v);
29           g[u][v]=1;
30        }
31        for(int k=1; k<=n; ++k)
32           for(int i=1; i<=n; ++i)
33              for(int j=1; j<=n; ++j)
34                if(!g[i][j])
35                   g[i][j]=g[i][k]&&g[k][j];
36        memset(linker, 0, sizeof(linker));
37        int ans=0;
38        for(int i=1; i<=n; ++i){
39            memset(vis, 0, sizeof(vis));
40            if(dfs(i))  ++ans;
41        }
42        printf("%d\n", n-ans);
43    }
44    return 0;
45 }

poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)

时间: 2024-10-31 15:24:06

poj 2594Treasure Exploration(有向图路径可相交的最小路径覆盖)的相关文章

POJ 3020 Antenna Placement(二分图建图训练 + 最小路径覆盖)

题目链接:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 3325 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobi

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

POJ 2594 Treasure Exploration(带交叉路的最小路径覆盖)

题意: 派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上,再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点.有的点可以重复去. 输入数据: 首先是n和m, 代表有n个顶点, m条边.(m和n同时为0时则输入数据结束) 接下来m行,每行两个数字 a, b代表 从a到b可以通行. 题目分析: 这道题目与最小路径有一点差别,最小路径覆盖上是不存在交叉路的,但是这个题目是存在交叉路的. 对于交叉路的处理我们可以使用Floyd闭包传递.即 i->j, j->

POJ 1422 &amp;&amp; ZOJ 1525 --Air Raid【二分图 &amp;&amp; 最小路径覆盖】

Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7451   Accepted: 4434 Description Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an i

POJ 1442 Air Raid(DAG图的最小路径覆盖)

题意: 有一个城镇,它的所有街道都是单行(即有向)的,并且每条街道都是和两个路口相连.同时已知街道不会形成回路. 可以在任意一个路口放置一个伞兵,这个伞兵会顺着街道走,依次经过若干个路口. 问最少需要投放几个伞兵,使得每个路口都被伞兵拜访过.并且要满足每个路口只能被一个伞兵拜访过. 思路: 裸DAG图的最小路径覆盖. DAG图的最小路径覆盖数 = 节点数 - 二分图最大匹配 代码: vector<int> graph[125]; int cx[125],cy[125]; bool bmask[

poj 3681 Finding the Rectangle 尺取法解最小矩形覆盖问题

题意: 平面上有n个点,现在要求一个面积最小的矩形能完全覆盖其中的m个点(边界不算). 分析: 求满足某个性质的最小区间的问题尺取法比二分还要高效,这题可以在x上暴力枚举,在y上用尺取法(在x,y上都用尺取法是不对的). 代码: //poj 3681 //sep9 #include <iostream> #include <algorithm> using namespace std; int n,m,ans; struct P { int x,y; }pnt1[256],pnt2

匈牙利算法 hdu 1151有向图的最小路径覆盖=顶点数-最大匹配数

Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3617    Accepted Submission(s): 2377 Problem Description Consider a town where all the streets are one-way and each street leads from on

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

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

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1