C/C++ floyd warshall算法求最短路径算法详解及源码

Floyd Warshall算法是一种用于求解所有节点对之间的最短路径的动态规划算法。它可以处理具有负权边的图,并且对于稠密图来说是一种高效的算法。

算法原理:

  1. 初始化一个二维数组dist,大小为n*n,其中n是图的节点数。
  2. 对dist进行初始化,dist[i][j]表示从节点i到节点j的最短路径长度。如果i和j之间没有边,则dist[i][j]为无穷大;如果i和j之间有边,则dist[i][j]为边的权重。
  3. 使用三重循环,对于每对节点(i, j),尝试通过节点k进行中转,如果通过k可以使得路径变短,则更新dist[i][j]为更短的路径长度。即:dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
  4. 循环结束后,dist[i][j]中记录的就是节点i到节点j的最短路径长度。

优点:

  1. Floyd Warshall算法可以求解所有节点对之间的最短路径,不需要指定起点和终点。
  2. 可以处理有负权边的图。
  3. 对于稠密图来说,算法相对高效。

缺点:

  1. 时间复杂度为O(n^3),对于较大的图,运行时间可能会很长。
  2. 对于稀疏图来说,算法效率较低。

以下是使用C++语言实现Floyd Warshall算法的示例代码:

#
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++实现Floyd算法最短路径的示例代码: ```cpp #include <iostream> #include <vector> using namespace std; const int INF = 0x3f3f3f3f; // 表示无穷大 const int MAXN = 100; // 最大顶点数 int G[MAXN][MAXN]; // 存储图的邻接矩阵 int dist[MAXN][MAXN]; // 存储最短路径的长度 int path[MAXN][MAXN]; // 存储最短路径上的顶点 void floyd(int n) { // 初始化dist和path数组 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { dist[i][j] = G[i][j]; path[i][j] = -1; } } // Floyd算法核心代码 for (int k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (dist[i][j] > dist[i][k] + dist[k][j]) { dist[i][j] = dist[i][k] + dist[k][j]; path[i][j] = k; } } } } } // 输出从i到j的最短路径 void print_path(int i, int j) { if (path[i][j] == -1) { cout << j << " "; } else { int k = path[i][j]; print_path(i, k); print_path(k, j); } } int main() { int n, m; cin >> n >> m; // 初始化邻接矩阵 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { if (i == j) { G[i][j] = 0; } else { G[i][j] = INF; } } } // 读入边的信息 for (int i = 0; i < m; ++i) { int u, v, w; cin >> u >> v >> w; G[u][v] = w; } floyd(n); // 输出每对顶点之间的最短路径长度和路径 for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { cout << "From " << i << " to " << j << ": " << dist[i][j] << ", path: "; print_path(i, j); cout << endl; } } return 0; } ``` 在上述代码中,`G[i][j]`表示顶点i到顶点j的边权值,如果i和j之间没有边,则`G[i][j]`应该设置为一个较大的数(本示例中设为INF)。 `dist[i][j]`表示从顶点i到顶点j的最短路径长度,`path[i][j]`表示从顶点i到顶点j的最短路径上的顶点。 在`floyd()`函数中,先用邻接矩阵初始化`dist`和`path`数组,然后按照Floyd算法的步骤进行计算。在计算过程中,如果发现从顶点i到顶点j经过顶点k的路径长度更短,则更新`dist[i][j]`和`path[i][j]`的值。 在输出最短路径时,可以使用递归函数`print_path()`来输出从i到j的路径。如果`path[i][j]`为-1,则表示从i到j直接有一条边,输出j即可;否则,先输出从i到k的路径,再输出从k到j的路径即可。 最后,遍历每对顶点之间的最短路径长度和路径,输出结果即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值