多源最短路 Floyd 详解
经典多源最短路 Floyd 算法
/* * 多源最短路 * 最短路是图论中最为常见的问题之一。按照源点的个数,可以分为单源最短路和多源最短路。 * 在前几篇博客中,我们介绍了单源最短路的 Dijkstra 算法, Bellman-ford 算法, Spfa 算法。复杂度分别为 O(MlogM)、O(NM)、O(最坏NM,平均KM)。 * * 多源最短路的算法,当然可以通过多次运行单源最短路解决,而且复杂度很低。不过也有几种多源最短路的算法,如 Floyd 最短路算法。 * Floyd 最短路: * 算法复杂度: * O(N^3) * 算法思路: * for (int k = 1; k <= n; k ++ ) { * for (int i = 1; i <= n; i ++ ) { * for (int j = 1; j <= n; j ++ ) { * dist[i][j][k] = min(dist[i][j][k-1], dist[i][k][k-1] + dist[k][j][k-1]); * } * } * } * 算法证明: * dist[u][v][k] 表示 除了 u, v 源点和终点,路径上所经过的点只能为 1, 2, ..., k中的点,在此条件下的最短路径长度。 * 那么,动态规划的递归公式可以为 * dist[u][v][k] = min(dist[u][v][k-1], dist[u][k][k-1] + dist[k][v][k-1]); * 表示倘若最短路径上加入了 k 点,那么必有 u->k 和 k->v 这样的路径作为支撑。 * 从证明的角度可以看出,Floyd 支持负边,任何最短路都不支持负环。 * 算法巧解: * 空间优化初级版: * 可以看出 DP 过程中,可以应用滚动数组求解。 空间复杂度 O(N^2)。 * 空间优化进阶版: * 关键点在于 dist[i][k][k]、dist[k][j][k] 在 k 这个循环中,永远不会更新 * 也就是说 dist[i][k][k] = dist[i][k][k - 1],dist[k][j][k] = dist[k][j][k - 1],因为 k 点的加入不会影响。 * 因为我们完全可以 忽略第三维度!!! * for (int k = 1; k <= n; k ++ ) * for (int i = 1; i <= n; i ++ ) * for (int j = 1; j <= n; j ++ ) * dist[i][j][k] = min(dist[i][j][k-1], dist[i][k][k-1] + dist[k][j][k-1]); */ #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <vector> using namespace std; const int N = 210, INF = 0x3f3f3f3f; int n, m, q; int dist[N][N]; int main() { scanf("%d%d%d", &n, &m, &q); memset(dist, 0x3f, sizeof dist); for (int i = 1; i <= n; i ++ ) { dist[i][i] = 0; } int a, b, c; while (m -- ) { scanf("%d%d%d", &a, &b, &c); dist[a][b] = min(dist[a][b], c); } for (int k = 1; k <= n; k ++ ) { for (int i = 1; i <= n; i ++ ) { for (int j = 1; j <= n; j ++ ) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } while (q -- ) { scanf("%d%d", &a, &b); if (dist[a][b] >= INF / 2) { printf("impossible\n"); } else { printf("%d\n", dist[a][b]); } } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)