Sightseeing Trip
Floyd逐点统计最小环并还原节点路径
正文
// 原题:https://oj.yecheng.tv/p/T1494
// 题意:n<=100 的无向图,求至少含 3 个点、点不重复且边权和最小的环,输出环上节点顺序,无解输出 No solution.
// 思路:Floyd 逐层加入中转点 k,先用只含前 k-1 个中转点的最短路 d[i][j] 配合边 i-k、k-j 更新最小环,再用 k 松弛 d,路径由 pre 数组还原。
// 复杂度:O(n^3) 时间 / O(n^2) 空间
// 易错点:必须先用 k 统计环再用 k 更新 d,顺序颠倒会算错;环要求三点互异,枚举时限定 i<j<k 即可保证。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 105;
const int INF = 0x3f3f3f3f;
int a[MAXN][MAXN];
int d[MAXN][MAXN];
int pre[MAXN][MAXN];
vector<int> path;
void getPath(int i, int j){
if(pre[i][j] == 0) return;
getPath(i, pre[i][j]);
path.push_back(pre[i][j]);
getPath(pre[i][j], j);
}
int main(){
int n, m;
if(!(cin >> n >> m)) return 0;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
a[i][j] = INF;
d[i][j] = INF;
}
a[i][i] = 0;
d[i][i] = 0;
}
for(int i = 0; i < m; i++){
int x, y, z;
cin >> x >> y >> z;
if(z < a[x][y]) a[x][y] = a[y][x] = z;
d[x][y] = a[x][y];
d[y][x] = a[y][x];
}
int ans = INF;
for(int k = 1; k <= n; k++){
for(int i = 1; i < k; i++){
for(int j = i + 1; j < k; j++){
if(d[i][j] >= INF || a[i][k] >= INF || a[k][j] >= INF) continue;
if(d[i][j] + a[i][k] + a[k][j] < ans){
ans = d[i][j] + a[i][k] + a[k][j];
path.clear();
path.push_back(i);
getPath(i, j);
path.push_back(j);
path.push_back(k);
}
}
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
if(d[i][k] + d[k][j] < d[i][j]){
d[i][j] = d[i][k] + d[k][j];
pre[i][j] = k;
}
}
}
}
if(ans >= INF){
cout << "No solution." << '\n';
return 0;
}
int st = 0;
for(size_t i = 1; i < path.size(); i++){
if(path[i] < path[st]) st = (int)i;
}
for(size_t t = 0; t < path.size(); t++){
if(t) cout << ' ';
cout << path[(st + t) % path.size()];
}
cout << '\n';
return 0;
}
一本通·提高篇的其它内容
- 活动安排
- 种树
- 喷水装置
- 加工生产调度
- 智力大冲浪
- 数列极差
- 数列分段
- 线段
- 家庭作业
- 钓鱼
- 糖果传递
- 愤怒的牛
- Best Cow Fences
- 曲线
- 数列分段 II
- 扩散
- 灯泡
- 传送带
- 数的划分
- 生日蛋糕
- 小木棍
- Addition Chains
- 埃及分数
- 平板涂色
- 质数方阵
- 靶形数独
- 电路维修
- 魔板
- Knight Moves
- 棋盘游戏
- Keyboarding
- 移动玩具
- 山峰和山谷
- Oulipo
- 图书管理
- Power Strings
- Seekthe Name, Seek the Fame
- Friends
- A Horrible Poem
- Beads
- Antisymmetry
- 门票
- 收集雪花
- 剪花布条
- Power Strings
- Radio Transmission
- OKR-Periods of Words
- 似乎在梦中见过的样子
- Censoring
- Phone List
- The XOR Largest Pair
- Nikitosh 和异或
- Immediate Decodability
- L 语言
- Secret Message 秘密信息
- 背单词
- The Xor-longest Path
- Keywords Search
- 玄武密码
- Censoring