Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)
题目链接:
题目描述:
在外星上有n个点需要机器人去探险,有m条单向路径。问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过。
解题思路:
一眼看上去是普通的最小边覆盖,但是仔细想后发现如果在原图上进行最大匹配的话,每个点只能经过一次。这样的话对于本题求出的并不是最优解,所以我们要先对原图进行传递闭包处理,然后再进行最大匹配。
这个题目点数太少H_K和匈牙利算法在空间和时间上并没有什么差,就代码复杂度而言匈牙利算法更有优势。
- #include <iostream>//匈牙利算法
- #include <cstring>
- #include <queue>
- #include <cmath>
- #include <cstdio>
- using namespace std;
- const int maxn = ;
- int maps[maxn][maxn], n, m;
- int used[maxn], vis[maxn];
- void floyd ()
- {
- for (int k=; k<=n; k++)
- for (int i=; i<=n; i++)
- for (int j=; j<=n; j++)
- if (maps[i][k] && maps[k][j])
- maps[i][j] = ;
- }
- int Find (int u)
- {
- for (int i=; i<=n; i++)
- {
- if (!vis[i] && maps[u][i])
- {
- vis[i] = ;
- if (!used[i] || Find(used[i]))
- {
- used[i] = u;
- return ;
- }
- }
- }
- return ;
- }
- int main ()
- {
- while (scanf ("%d %d", &n, &m), n||m)
- {
- memset (maps, , sizeof(maps));
- while (m --)
- {
- int u, v;
- scanf ("%d %d", &u, &v);
- maps[u][v] = ;
- }
- floyd ();
- memset (used, , sizeof(used));
- int res = ;
- for (int i=; i<=n; i++)
- {
- memset (vis, , sizeof(vis));
- res += Find(i);
- }
- printf ("%d\n", n - res);
- }
- return ;
- }
- #include <iostream>//H_K算法
- #include <cstring>
- #include <queue>
- #include <cmath>
- #include <cstdio>
- using namespace std;
- const int maxn = ;
- const int INF = 0x3f3f3f3f;
- int maps[maxn][maxn], n, m, dx[maxn], dy[maxn];
- int vis[maxn], cx[maxn], cy[maxn], dis;
- void floyd ()
- {
- for (int k=; k<=n; k++)
- for (int i=; i<=n; i++)
- for (int j=; j<=n; j++)
- if (maps[i][k] && maps[k][j])
- maps[i][j] = ;
- }
- bool bfs ()
- {
- queue <int> Q;
- dis = INF;
- memset (dx, -, sizeof(dx));
- memset (dy, -, sizeof(dy));
- for (int i=; i<=n; i++)
- if (cx[i] == -)
- {
- Q.push(i);
- dx[i] = ;
- }
- while (!Q.empty())
- {
- int u = Q.front();
- Q.pop();
- if (dx[u] > dis)
- break;
- for (int i=; i<=n; i++)
- {
- if (dy[i]==- && maps[u][i])
- {
- dy[i] = dx[u] + ;
- if (cy[i] == -)
- dis = dy[i];
- else
- {
- dx[cy[i]] = dy[i] +;
- Q.push (cy[i]);
- }
- }
- }
- }
- return dis != INF;
- }
- int dfs (int u)
- {
- for (int v=; v<=n; v++)
- {
- if (!vis[v] && dx[u]+==dy[v] && maps[u][v])
- {
- vis[v] = ;
- if (cy[v]!=- && dis==dy[v])
- continue;
- if (cy[v]==- || dfs(cy[v]))
- {
- cx[u] = v;
- cy[v] = u;
- return ;
- }
- }
- }
- return ;
- }
- int Max_match ()
- {
- int res = ;
- memset (cx, -, sizeof(cx));
- memset (cy, -, sizeof(cy));
- while (bfs())
- {
- memset (vis, , sizeof(vis));
- for (int i=; i<=n; i++)
- if (cx[i] == -)
- res += dfs (i);
- }
- return res;
- }
- int main ()
- {
- while (scanf ("%d %d", &n, &m), n||m)
- {
- memset (maps, , sizeof(maps));
- while (m --)
- {
- int u, v;
- scanf ("%d %d", &u, &v);
- maps[u][v] = ;
- }
- floyd ();
- printf ("%d\n", n - Max_match());
- }
- return ;
- }
Poj 2594 Treasure Exploration (最小边覆盖+传递闭包)的更多相关文章
- poj 2594 Treasure Exploration(最小路径覆盖+闭包传递)
http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total ...
- POJ 2594 Treasure Exploration(最小路径覆盖变形)
POJ 2594 Treasure Exploration 题目链接 题意:有向无环图,求最少多少条路径能够覆盖整个图,点能够反复走 思路:和普通的最小路径覆盖不同的是,点能够反复走,那么事实上仅仅要 ...
- POJ 2594 —— Treasure Exploration——————【最小路径覆盖、可重点、floyd传递闭包】
Treasure Exploration Time Limit:6000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64 ...
- poj 2594 Treasure Exploration (二分匹配)
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 6558 Accepted: 2 ...
- POJ 2594 Treasure Exploration 最小可相交路径覆盖
最小路径覆盖 DAG的最小可相交路径覆盖: 算法:先用floyd求出原图的传递闭包,即如果a到b有路径,那么就加边a->b.然后就转化成了最小不相交路径覆盖问题. 这里解释一下floyd的作用如 ...
- poj 2594 Treasure Exploration 二分图匹配
点击打开链接题目链接 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 7215 ...
- POJ 2594 Treasure Exploration (可相交最小路径覆盖)
题意 给你张无环有向图,问至少多少条路径能够覆盖该图的所有顶点--并且,这些路径可以有交叉. 思路 不是裸的最小路径覆盖,正常的最小路径覆盖中两个人走的路径不能有重复的点,而本题可以重复. 当然我们仍 ...
- POJ 2594 Treasure Exploration (Floyd+最小路径覆盖)
<题目链接> 题目大意: 机器人探索宝藏,有N个点,M条边.问你要几个机器人才能遍历所有的点. 解题分析: 刚开始还以为是最小路径覆盖的模板题,但是后面才知道,本题允许一个点经过多次,这与 ...
- POJ 2594 Treasure Exploration(带交叉路的最小路径覆盖)
题意: 派机器人去火星寻宝,给出一个无环的有向图,机器人可以降落在任何一个点上,再沿着路去其他点探索,我们的任务是计算至少派多少机器人就可以访问到所有的点.有的点可以重复去. 输入数据: 首先是n和 ...
随机推荐
- eclipse提速02 - eclipse.ini优化
给eclipse执行jvm.它可以让你使用自己的jdk,而不是系统环境变量所指定的jdk -vm /path/to/your/java 使用最新的jdk来运行eclipse.使用最新的jdk要好很多. ...
- nexus-3本地下载jar的settipng.xml配置
打开maven安装目录下的setting.xml <servers> <server> <id>nexus</id> <username>a ...
- 利用Druid实现应用和SQL监控
一.关于Druid Druid是一个JDBC组件,它包括三部分: DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource 高效可 ...
- [Angular] Architectures for Huge Angular Based Enterprise
Using Angular CLI v6, we are able to create library or small application inside a Angular CLI genera ...
- ubuntu安装nginx时提示error: the HTTP rewrite module requires the PCRE library
ubuntu安装nginx时提示error: the HTTP rewrite module requires the PCRE library 须要安装pcre包. sudo apt-get upd ...
- 微信小程序之 Tabbar(底部选项卡)
1.项目目录 2.在app.json里填写:tab个数范围2-5个 app.json { "pages": [ "pages/index/index", &qu ...
- 在云服务器 ECS Linux CentOS 7 下重启服务不再通过 service 操作,而是通过 systemctl 操作
在云服务器 ECS Linux CentOS 7 下重启服务不再通过 service 操作,而是通过 systemctl 操作. 操作说明如下: 1. 查看 sshd 服务是否启动: 看到上述信息就 ...
- 下载Youku视频观看
所需工具: 1.chorme内核浏览器,如Chorme.Firefox等等 2.vlc视频播放器 准备工作完成,开始工作 1.打开优酷的随便一个视频 2.按下F12选择Network(网络)选择Med ...
- nhibernate的关系
用nhibernate,觉得比较难把握的是其中表间的关系. 我用的是Fluently Nhibernate,直接用代码,而不是XML来书写代码与数据表的映射.其中表间关系有3种: 1.Referenc ...
- create database 默认utf-8
CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 这是sql语句 CREATE TA ...