首页 > 后端开发 > C++ > 正文

c++中如何实现Floyd最短路径_c++ Floyd最短路径实现方法

冰火之心
发布: 2025-10-10 08:30:02
原创
822人浏览过
Floyd算法通过动态规划求任意两点间最短路径,核心是三重循环更新距离矩阵:disti = min(disti, disti + distk),适用于含负权边但无负权环的图。

c++中如何实现floyd最短路径_c++ floyd最短路径实现方法

在C++中实现Floyd最短路径算法,主要是利用动态规划的思想求解图中任意两点之间的最短距离。该算法适用于带权有向或无向图,能处理负权边(但不能有负权环)。

算法基本思想

Floyd算法通过一个三维递推过程逐步更新任意两点间的最短路径。其核心公式为:

dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

其中 k 是中间节点,i 和 j 是起始和终止节点。算法枚举所有可能的中间节点 k,尝试通过 k 缩短 i 到 j 的路径。

立即学习C++免费学习笔记(深入)”;

代码实现步骤

以下是完整的C++实现方法:

1. 定义图的大小和初始化距离矩阵

2. 输入边的信息并填充初始距离值

3. 使用三重循环执行Floyd算法

4. 输出任意两点间的最短路径

#include <iostream>

#include <vector>

#include <climits>

using namespace std;

const int INF = INT_MAX / 2; // 防止加法溢出

void floyd(vector<vector<int>>& dist, int n) {

    for (int k = 0; k

        for (int i = 0; i

            for (int j = 0; j

                if (dist[i][k] != INF && dist[k][j] != INF) {

                    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);

                }

            }

        }

    }

}

void printDist(const vector<vector<int>>& dist, int n) {

    cout

    for (int i = 0; i

        for (int j = 0; j

            if (dist[i][j] == INF)

                cout << "INF ";

Eva Design System
Eva Design System

基于深度学习的色彩生成器

Eva Design System 86
查看详情 Eva Design System

            else

                cout << dist[i][j] << " ";

        }

        cout << endl;

    }

}

int main() {

    int n = 4; // 节点数

    vector<vector<int>> dist(n, vector<int>(n, INF));

    // 自身到自身距离为0

    for (int i = 0; i

        dist[i][i] = 0;

    // 添加边:u -> v, 权重 w

    dist[0][1] = 3;

    dist[0][2] = 6;

    dist[1][2] = 4;

    dist[1][3] = 4;

    dist[2][3] = 8;

    floyd(dist, n);

    printDist(dist, n);

    return 0;

}

关键注意事项

Floyd算法的时间复杂度为 O(n³),空间复杂度为 O(n²),适合节点数量不多的图(一般 n ≤ 500)。

使用INT_MAX时要小心溢出问题,建议用一个较大的有限值代替,如 INT_MAX / 2。

若需记录路径而不仅是距离,可额外维护一个 path[i][j] 数组记录中间节点,通过递归回溯输出具体路径。

基本上就这些,实现简单,重点在于初始化和三层循环的顺序。

以上就是c++++中如何实现Floyd最短路径_c++ Floyd最短路径实现方法的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号