From 2c31ab06e6800985e9b590e7b73fc4605f29dd5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Wed, 3 Jan 2024 14:25:58 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing_TiGao/T3/Floyd/344.cpp | 22 +++++++++++----------- TangDou/AcWing_TiGao/T3/Floyd/344.md | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344.cpp b/TangDou/AcWing_TiGao/T3/Floyd/344.cpp index 83e12a6..78ccb7c 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/344.cpp +++ b/TangDou/AcWing_TiGao/T3/Floyd/344.cpp @@ -3,7 +3,7 @@ using namespace std; const int N = 110, INF = 0x3f3f3f3f; int n, m; -int g[N][N], dist[N][N]; +int g[N][N], dis[N][N]; int path[N], idx; int mid[N][N]; int ans = INF; @@ -19,7 +19,7 @@ void get_path(int i, int j) { int main() { // n个顶点,m条边 - scanf("%d %d", &n, &m); + cin >> n >> m; // 初始化邻接矩阵 memset(g, 0x3f, sizeof g); @@ -27,12 +27,12 @@ int main() { while (m--) { int a, b, c; - scanf("%d %d %d", &a, &b, &c); + cin >> a >> b >> c; g[a][b] = g[b][a] = min(g[a][b], c); // 求最短路之类,(a,b)之间多条边输入只保留最短边 } - // 把原始地图复制出来到生成最短距离dist - memcpy(dist, g, sizeof dist); + // 把原始地图复制出来到生成最短距离dis + memcpy(dis, g, sizeof dis); for (int k = 1; k <= n; k++) { // 枚举每一个引入点k来连接缩短i,j的距离 /* @@ -41,13 +41,13 @@ int main() { 其实循环到n也是可以的,不过当i, j, k中有两个相同时就要continue一下 Q2:为什么非得把DP的这段代码嵌入到Floyd的整体代码中,不能先Floyd后再进行DP吗? - A:是不可以的。因为在进行插入节点号为k时,其实dist[i][j]中记录的是1~k-1插点后的最小距离, + A:是不可以的。因为在进行插入节点号为k时,其实dis[i][j]中记录的是1~k-1插点后的最小距离, 而不是全部插入点后的最短距离。 */ for (int i = 1; i < k; i++) for (int j = i + 1; j < k; j++) - if (g[i][k] + g[k][j] < ans - dist[i][j]) { // 减法防止爆INT - ans = dist[i][j] + g[i][k] + g[k][j]; + if (g[i][k] + g[k][j] < ans - dis[i][j]) { // 减法防止爆INT + ans = dis[i][j] + g[i][k] + g[k][j]; // 找到更小的环,需要记录路径,并且要求: 最小环的所有节点(按顺序输出) // 顺序 // 1. 上面的i,j枚举逻辑是j>i,所以i是第一个 @@ -56,7 +56,7 @@ int main() { // 4. 记录k idx = 0; path[idx++] = i; - get_path(i, j); // i是怎么到达j的?就是问dist[i][j]是怎么获取到的,这是在求最短路径过程中的一个路径记录问题 + get_path(i, j); // i是怎么到达j的?就是问dis[i][j]是怎么获取到的,这是在求最短路径过程中的一个路径记录问题 path[idx++] = j; path[idx++] = k; } @@ -64,8 +64,8 @@ int main() { // 正常floyd for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) - if (dist[i][j] > dist[i][k] + dist[k][j]) { - dist[i][j] = dist[i][k] + dist[k][j]; + if (dis[i][j] > dis[i][k] + dis[k][j]) { + dis[i][j] = dis[i][k] + dis[k][j]; mid[i][j] = k; // 记录路径i->j 是通过k进行转移的 } } diff --git a/TangDou/AcWing_TiGao/T3/Floyd/344.md b/TangDou/AcWing_TiGao/T3/Floyd/344.md index 6384c32..2138e43 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/344.md +++ b/TangDou/AcWing_TiGao/T3/Floyd/344.md @@ -40,7 +40,7 @@ $1≤N≤100,1≤M≤10000,1≤l<500$ ![](https://cdn.acwing.com/media/article/image/2021/12/18/85607_ee5522ae60-g.png) -$floyd$是 **插点** 算法,在点$k$被 **插入前** 可计算$i->x>j,x \in [1 \sim k-1]$这样的最短路,当然,也可以不选择任何一个中间点,$dist[i][j]$天生最小。 +$floyd$是 **插点** 算法,在点$k$被 **插入前** 可计算$i \rightarrow x \rightarrow j,x \in [1 \sim k-1]$这样的最短路,当然,也可以不选择任何一个中间点,$dist[i][j]$天生最小。 枚举所有以$k$为环中 **最大节点** 的环即可。