「POJ1734」Sightseeing trip
「POJ1734」Sightseeing trip
传送门
这题就是要我们求一个最小环并且按顺序输出一组解。
考虑 \(O(n^3)\) 地用 \(\text{Floyd}\) 求最小环:
考虑 \(\text{Floyd}\) 的过程,在最外层循环枚举到 \(k\) 时,最短路矩阵中,\(f_{i, j}\) 存储的就是 \(i\) 到 \(j\) 经过点 \(1\cdots k - 1\) 的最短路。
那么我们就可以在这时枚举和点 \(k\) 相邻的两个点 \(i, j\),\(\min \left\{f_{i, j} + w(i, k) + w(j, k)\right\}\) 就是包含点 \(k\) 的最小环长度,然后再用点 \(k\) 更新最短路矩阵,取最小值即可。
对于路径的输出,只需要在更新最短路时记录一下中转点然后每次递归处理即可。
参考代码:
#include <cstring>
#include <cstdio>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline T min(T a, T b) { return a < b ? a : b; }
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
}
const int _ = 102;
typedef long long LL;
int n, m, d[_][_], f[_][_], p[_][_], G[_];
inline void dfs(int x, int y) {
if (p[x][y] != 0) dfs(x, p[x][y]), G[++G[0]] = p[x][y], dfs(p[x][y], y);
}
int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n), read(m);
for (rg int i = 1; i <= n; ++i)
for (rg int j = 1; j <= n; ++j) d[i][j] = 2147483647;
for (rg int i = 1; i <= n; ++i) d[i][i] = 0;
for (rg int u, v, l; m--; )
read(u), read(v), read(l), d[u][v] = d[v][u] = min(d[u][v], l);
for (rg int i = 1; i <= n; ++i)
for (rg int j = 1; j <= n; ++j) f[i][j] = d[i][j];
int ans = 2147483647;
for (rg int k = 1; k <= n; ++k) {
for (rg int i = 1; i < k; ++i)
for (rg int j = 1; j < i; ++j) {
if (ans > (LL) d[k][i] + f[i][j] + d[j][k]) {
ans = d[k][i] + f[i][j] + d[j][k];
G[0] = 0, G[++G[0]] = i, dfs(i, j), G[++G[0]] = j, G[++G[0]] = k;
}
}
for (rg int i = 1; i <= n; ++i)
for (rg int j = 1; j <= n; ++j)
if (f[i][j] > (LL) f[i][k] + f[k][j])
f[i][j] = f[i][k] + f[k][j], p[i][j] = k;
}
if (ans == 2147483647) puts("No solution.");
else for (rg int i = 1; i <= G[0]; ++i) printf("%d ", G[i]);
return 0;
}
「POJ1734」Sightseeing trip的更多相关文章
- 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd
题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...
- 【poj1734】Sightseeing trip
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8520 Accepted: 3200 ...
- #10072. 「一本通 3.2 例 1」Sightseeing Trip(floyd求最小环+路径)
https://loj.ac/problem/10072 针对无向图 因为Floyd是按照结点的顺序更新最短路的,所以我们在更新最短路之前先找到一个连接点k,当前的点k肯定不存在于已存在的最短路f[i ...
- 【POJ1734】Sightseeing Trip 无向图最小环
题目大意:给定一个 N 个顶点的无向图,边有边权,如果存在,求出该无向图的最小环,即:边权和最小的环,并输出路径. 题解:由于无向图,且节点数较少,考虑 Floyd 算法,在最外层刚开始遍历到第 K ...
- poj1734 Sightseeing trip【最小环】
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions:8588 Accepted:3224 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
随机推荐
- 进程池与线程池、协程、协程实现TCP服务端并发、IO模型
进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度 ...
- NLP开源工具
最近有人问我几次NLP有哪些开源工具,这里做个笔记.
- 计算机二级-C语言-程序设计题-190111记录-两种指针赋值的不同,普通输入输出函数和文件输入输出函数的使用
//程序设计题:函数fun的功能是:将两位数的正整数a,b合并形成一个整数放在c中.合并的方式是:将a数的十位和个位数依次放在c数的个位和百位上,b数的十位和个位数依次放在c数的十位和千位上.例如:当 ...
- 如何把web项目部署到Linux云服务器(详细流程)
转自: https://blog.csdn.net/M_Kerry/article/details/81664548
- 例题3_2 WERTYU(UVa10082)
把手放在键盘上时,稍不注意就会往右错一位.这样,输入Q会变成W,输入J会变成K等.键盘如下图所示: 输入一个错位后敲出的字符串(所有字母均大写),输出打字员本来想打出的句子.输入保证合法,即一定是错位 ...
- Python的 REPL 模式
REPL Read Eval Print Loop读取,执行,输出,循环 在REPL环境中,你输入一句话,他就读取,执行,输出一个结果,所以也称为 交互式提示模式这是python代码最简单的方式,也揭 ...
- idea搭建项目注意事项
1,pom.xml文件中要加入 <!-- 强制将xml文件打到war包中 s--><resources> <resource> <directory> ...
- 拼接 字典序min
给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字符串拼起来之后形成的字符串具有最低的字典序. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个 ...
- 在Ubuntu_meta 16.04中设置默认Python3.5的命令
ubuntu_meta 默认是安装了python2.7 和python3.5两个版本 查看ubuntu的python版本,默认版本是python2.7 输入:python 直接执行这两个命令即可: s ...
- SprintBoot学习(三)
Thymeleaf模板引擎 1.thymeleaf是一个Java类库,,他是xml/xhtml/html5的模板引擎可以作为view层 2.themeleaf基本语法 引入thymeleaf < ...