From c9c962258f9e86d8e3f8934924d5eb1e0f76ba48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Thu, 4 Jan 2024 16:30:40 +0800 Subject: [PATCH] 'commit' --- .../T3/Floyd/{344.cpp => 344_1.cpp} | 0 TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp | 73 +++++++++++++++++++ TangDou/Topic/【Floyd专题】.md | 3 + 3 files changed, 76 insertions(+) rename TangDou/AcWing_TiGao/T3/Floyd/{344.cpp => 344_1.cpp} (100%) create mode 100644 TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344.cpp b/TangDou/AcWing_TiGao/T3/Floyd/344_1.cpp similarity index 100% rename from TangDou/AcWing_TiGao/T3/Floyd/344.cpp rename to TangDou/AcWing_TiGao/T3/Floyd/344_1.cpp diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp b/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp new file mode 100644 index 0000000..73d4710 --- /dev/null +++ b/TangDou/AcWing_TiGao/T3/Floyd/344_2.cpp @@ -0,0 +1,73 @@ +#include +using namespace std; +const int N = 110; +#define INF 0x7ffffff +/** +分析:模板题,理解floyd 的在 i , j 路径中没有包含k(因为此时k未用来更新),即可写出最小环 +在INF这里wa了两发,习惯值 1e9 不是最大值(查找时判断一下可以避免,但。。。懒了) +*/ +int n, m; +int mp[N][N]; +int g[N][N]; +int path[N][N]; +int ans[N]; +int cnt; +int mm; +void floyd() { + mm = INF; + for (int k = 1; k <= n; k++) { + for (int i = 1; i < k; i++) { + for (int j = i + 1; j < k; j++) { + int x = g[i][j] + mp[k][i] + mp[k][j]; + if (x < mm) { + mm = x; + int tmp = j; + cnt = 0; + + while (tmp != i) { + ans[cnt++] = tmp; + tmp = path[i][tmp]; + } + ans[cnt++] = i; + ans[cnt++] = k; + } + } + } + + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + if (g[i][j] > g[i][k] + g[k][j]) { + g[i][j] = g[i][k] + g[k][j]; + path[i][j] = path[k][j]; + } + } + } + } +} + +int main() { + while (cin >> n >> m) { + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= n; j++) { + g[i][j] = mp[i][j] = INF; + path[i][j] = i; + } + } + + while (m--) { + int a, b, c; + cin >> a >> b >> c; + g[a][b] = g[b][a] = min(g[a][b], c); // 防重边 + mp[a][b] = mp[b][a] = g[a][b]; + } + + floyd(); + + if (mm == INF) { + puts("No solution."); + continue; + } + for (int i = 0; i < cnt; ++i) printf("%d%s", ans[i], (i == cnt - 1) ? "\n" : " "); + } + return 0; +} \ No newline at end of file diff --git a/TangDou/Topic/【Floyd专题】.md b/TangDou/Topic/【Floyd专题】.md index 3b0b46b..9383145 100644 --- a/TangDou/Topic/【Floyd专题】.md +++ b/TangDou/Topic/【Floyd专题】.md @@ -180,6 +180,9 @@ int main() { return 0; } ``` +**$TODO$** +据说可以使用$Dijkstra$算法解决,有空可以试试: **[链接](https://blog.csdn.net/K_R_forever/article/details/80525757)** + https://juejin.cn/post/6935691567696969764 \ No newline at end of file