佛洛依德算法算法作为一个经典的求最短路径的算法,思路其实很简单,就是不停地进行“松弛操作”,直到全部遍历一遍。那么什么是松弛操作呢?比如说我们的图存在一个邻接矩阵graph中,graph[v][u]为顶点v到顶点u的路径长度,松弛操作就是寻找一个中间节点k,使graph[v][u]>graph[v][k]+graph[k][u],若得到此关系,说明通过这个中间节点可以减小v和u之间的距离,所以我们更新距离,graph[v][u]=graph[v][k]+graph[k][u],一直重复操作,直到所有中间节点k,所有v和u都被遍历到,此时循环结束,graph数组里的就是各节点间的最小距离,核心代码如下:

        for (int k = 0; k < size; k++){for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){if (graph[i][j] > graph[i][k] + graph[k][j]){graph[i][j] = graph[i][k] + graph[k][j];}}}}

全部的代码如下,节点数可自行更改:

#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;void InputGraph(vector<vector<int>> &graph)  //输入权值,否则为无穷大
{int count = 0;cin >> count;int size=graph.size();for (int i = 0; i < size; i++){graph[i][i] = 0;}for (int i = 0; i < count; i++){int start = -1, end = -1, weight = 0;cin >> start >> end >> weight;graph[start][end] = weight;}
}void Floyd(vector<vector<int>> &graph)  //使用佛洛依德算法求最短路径长度
{int size = graph.size();for (int k = 0; k < size; k++){for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){if (graph[i][j] > graph[i][k] + graph[k][j]){graph[i][j] = graph[i][k] + graph[k][j];}}}}for (int i = 0; i < 5; i++){for (int j = 0; j < 5; j++){cout <<setw(6)<< graph[i][j] << "  ";}cout << endl;}
}int main()
{vector<vector<int>> graph = vector<vector<int>>(5, vector<int>(5, 999999));InputGraph(graph);Floyd(graph);system("pause");return 0;
}

推免复习之数据结构与算法 佛洛依德算法相关推荐

  1. 佛洛依德算法求最短路径(记录路径信息)

    佛洛依德算法: 利用D矩阵拿到邻接矩阵中的权值.path矩阵记录两点之间的移动中转点(初始值为起点). 对于邻接矩阵中 i 到 j 点的权值进行比较,若加上一个中转点 k 后的权值小于原本的权值,则对 ...

  2. 十大常用算法之佛洛依德算法

    十大常用算法的完整实现 一.二分查找算法:https://blog.csdn.net/weixin_46635575/article/details/121532149 二.分治算法:https:// ...

  3. 最短路径算法之迪杰斯特拉算法(Dijkstra)和佛洛依德算法(Floyd)

    今天学习了这两种算法,都是用来求最小路径的算法,但是迪杰斯特拉算法只能从某个特定点到所有点的最短路径,而佛洛依德算法可以查出任意点到任意点的最小路径. 迪杰斯特拉: package dijkstra; ...

  4. 佛洛依德算法求最短路径实例

    佛洛依德算法求最短路径实例 #include <iostream> #include <string.h> #include <stdlib.h> #include ...

  5. 佛洛依德算法C语言简单实现

    计算图中每个顶点间的最短路径及路径长度 采用邻接矩阵表示图 代码如下: #include <stdio.h> #include <windows.h> #include < ...

  6. 迪杰斯特拉算法与佛洛依德算法

    迪杰斯特拉算法用于计算:某点v0到其他所有点的最短路径,时间复杂度为O(n^2) 初态: 设定V为所有顶点的集合. 设定S为已经得到的最短路径的顶点vi的集合.即S中的顶点vi,都是已经确定下来v0到 ...

  7. Java实现佛洛依德算法(floyd)的完整代码

    Java实现佛洛依德算法(floyd)的完整代码 /*** 弗洛伊德(floyd)算法求图中所有点对之间的最短路径:* 其中'-1'表示两点之间目前还没有联通的路径:* 结论:如果A点到G点之间有最短 ...

  8. 佛洛依德算法的学习与实现

    1.问题引入 带权有向图中单源点的最短路径问题可以用地杰斯特拉算法求解,如果要求解图中每一对顶点之间的最短路径,类似可以想到的方法为:每次以一个顶点为源点,重复执行地杰斯特拉算法算法n次,这样,便可以 ...

  9. 算法与数据结构学习(58)-程序员常用10种算法(佛洛依德算法)

    弗洛伊德(Floyd)算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算 ...

最新文章

  1. 从经济学与市场机制中,AI可以学到什么?| 美国三院院士迈克尔乔丹教授
  2. jquery方法animate操作图片移动
  3. 8个秘诀成就顶级增长黑客
  4. unity3d 数学的数学基础和辅助类
  5. javascript里你绝对用的上的字符分割函数--原创
  6. MySQL触发器 trigger学习
  7. 工作流实战_17_flowable 流程实例撤回
  8. CentOS Samba服务器的搭建与配置(share共享模式)
  9. Golang学习 - sort 包
  10. 《水经注全国POI兴趣点1.0》发布
  11. img标签底部总是留有一条白色空隙
  12. 英语学习、常用疑问句型,否定句
  13. 马王堆汉墓帛书‧老子——乙本释文(道经)
  14. java Web api接入讯飞aiui(1)
  15. Python框架之UnitTest
  16. 《老板最爱的简历表》阅读
  17. Linux进程间通信源码剖析,共享内存(shmget函数详解)
  18. 西门子服务器提升抱闸信号不输出,西门子V90伺服调试工程师不可不知的一些事儿...
  19. PDF 清晰度调整 —— PDF “ 剧烈瘦身 ”
  20. 卖货还能“带股价”,天猫超市怎么做到的?

热门文章

  1. 学java怎么赚钱?java怎么赚外快?
  2. 解决行业反复“造轮子”现象,全新地平线RDK系列机器人开发者套件上线
  3. On-chip Variations
  4. log4j和sout
  5. 支付流程的设计与实现逻辑
  6. Matplotlib学习---用mplot3d画莫比乌斯环(Mobius strip)
  7. 利用植物转录组数据库:资源、工具和方法
  8. python的变量名命名规则_python的变量命名规范
  9. ThreadPoolExecutor详解
  10. 解放生产力!chatGPT接入Excel与Word教程(需要魔法上网,不用的都是骗人的)