「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 ...
随机推荐
- C:数组基础
数组 在程序设计中,为了方便处理数据把具有相同类型的若干变量按有序形式组织起来--称为数组. 数组就是在内存中连续的相同类型的变量空间.同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的 ...
- ubuntu 先安装php再安装apache后,php不解析
本来服务器是nginx ,把他改成了apache, 安装apache, sudo apt-get updatesudo apt-get install apache2 然后访问ip,不成功 vim / ...
- 201771010135 杨蓉庆/张燕《面对对象程序设计(java)》第十三周学习总结
1.实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机制: (3) 掌握事件处理的基本编程模型: (4) 了解GUI界面组件观感设置方法: (5) 掌握W ...
- java篇 之 静态
Final:不可改变 Static:静态修饰符,在编译阶段就能确定了,可以修饰成员变量,相应的称之为静态变量 是一个共享的变量(被这个类和这个类所产生的对象所共享的,他是唯一的,出生时间 为类第一次产 ...
- Map-HashMap 与 IF 判断内存占用对比
HashMap与IF判断内存占用对比,事实证明,Map对象在以下情况确实比IF判断占用内存低. HashMap占用内存:13000 package com.taiping.bky; import ja ...
- 2_2 3n+1问题
猜想:对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半.经过若干次这样的变换,一定会使n变为1.例如:3→10→5→16→8→4→2→1. 输入n,输出变换的次数.n< ...
- PyQt5打印机
1.打印机操作(打印默认文本里面的内容)from PyQt5 import QtGui,QtWidgets,QtPrintSupportfrom PyQt5.QtWidgets import *imp ...
- Hibernate学习(七)
Hibernate缓存 1.一级缓存:Session 级别的缓存 2.二级缓存: SessionFactory 级别的缓存 3.查询缓存:需二级缓存的支持,查询缓存依赖二级缓存 一级缓存 1.依赖于 ...
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:MNIST最佳实践
import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data INPUT_N ...
- httpclient使用-get-post-传参
转自:https://www.jianshu.com/p/375be5929bed 一.HttpClient使用详解与实战一:普通的GET和POST请求 简介 HttpClient是Apache Ja ...