算法6.11 弗洛伊德算法

代码实现

//算法6.11 弗洛伊德算法
#pragma once
#include <iostream>
using namespace std;#define MaxInt 32767                        //表示极大值,即∞
#define MVNum 100                           //最大顶点数typedef char VerTexType;                     //假设顶点的数据类型为字符型
typedef int ArcType;                        //假设边的权值类型为整型 int Path[MVNum][MVNum];                       //最短路径上顶点vj的前一顶点的序号
int D[MVNum][MVNum];                        //记录顶点vi和vj之间的最短路径长度//------------图的邻接矩阵---------------
typedef struct
{VerTexType vexs[MVNum];                    //顶点表 ArcType arcs[MVNum][MVNum];           //邻接矩阵 int vexnum, arcnum;                      //图的当前点数和边数
}AMGraph;int LocateVex(AMGraph G, VerTexType v)
{//确定点v在G中的位置for (int i = 0; i < G.vexnum; ++i){if (G.vexs[i] == v){return i;}  }return -1;
}void CreateUDN(AMGraph& G)
{//采用邻接矩阵表示法,创建有向网G VerTexType v1, v2;ArcType w;int row;int col;//输入总顶点数,总边数cout << "请输入总顶点数,总边数,以空格隔开:";cin >> G.vexnum >> G.arcnum;cout << endl;cout << "输入点的名称,如a" << endl;for (int i = 0; i < G.vexnum; i++) {cout << "请输入第" << (i + 1) << "个点的名称:";//依次输入点的信息cin >> G.vexs[i];}cout << endl;//初始化邻接矩阵,边的权值均置为极大值MaxIntfor (int m = 0; m < G.vexnum; m++){for (int n = 0; n < G.vexnum; n++){if (m!=n){G.arcs[m][n] = MaxInt;}//=对角线元素设为0else{G.arcs[m][n] = 0;}}}//构造邻接矩阵(非对称)cout << "输入边依附的顶点及权值,如a b 3" << endl;for (int k = 0; k < G.arcnum; k++){ cout << "请输入第" << (k + 1) << "条边依附的顶点及权值:";cin >> v1 >> v2 >> w; //输入一条边依附的顶点及权值row = LocateVex(G, v1);  col = LocateVex(G, v2); //确定v1和v2在G中的位置,即顶点数组的下标 G.arcs[row][col] = w;   //边<v1, v2>的权值置为w }
} //输出有向网的邻接矩阵
void ShowGraph(AMGraph G)
{cout << "邻接矩阵为:" << endl;for (int i = 0; i < G.vexnum; i++){for (int j = 0; j < G.vexnum; j++){if (G.arcs[i][j]==MaxInt){cout << "∞" << " ";}else{cout << G.arcs[i][j] << " ";}}cout << endl;}}//用Floyd算法求有向网G中各对顶点i和j之间的最短路径
void ShortestPath_Floyed(AMGraph G)
{int i, j, k;//各对结点之间初始已知路径及距离 for (i = 0; i < G.vexnum; ++i){for (j = 0; j < G.vexnum; ++j){D[i][j] = G.arcs[i][j];if (D[i][j] < MaxInt && i != j){//如果i和j之间有弧,则将j的前驱置为i Path[i][j] = i;      }else{//如果i和j之间无弧,则将j的前驱置为-1 Path[i][j] = -1;    }}}//逐步增加中间顶点 for (k = 0; k < G.vexnum; ++k){//增加中间顶点后更新距离for (i = 0; i < G.vexnum; ++i){for (j = 0; j < G.vexnum; ++j){//从i经k到j的一条路径更短if (D[i][k] + D[k][j] < D[i][j]){          D[i][j] = D[i][k] + D[k][j];  //更新D[i][j] Path[i][j] = Path[k][j];  //更改j的前驱为k }}}}}
//显示最短路径
void DisplayPath(AMGraph G, int begin, int temp)
{if (Path[begin][temp] != -1) {DisplayPath(G, begin, Path[begin][temp]);cout << G.vexs[Path[begin][temp]] << "-->";}
}int main()
{cout << "************算法6.11 弗洛伊德算法**************" << endl;//创建有向网的邻接矩阵AMGraph G;char start, destination;int num_start, num_destination;CreateUDN(G);cout << "有向网G创建完成!" << endl;//输出有向网的邻接矩阵ShowGraph(G);ShortestPath_Floyed(G);cout << "请依次输入路径的起点与终点的名称:";cin >> start >> destination;num_start = LocateVex(G, start);num_destination = LocateVex(G, destination);DisplayPath(G, num_start, num_destination);cout << G.vexs[num_destination] << endl;cout << "最短路径的长度为:" << D[num_start][num_destination] << endl;cout << endl;system("pause");return 0;}

运行结果

算法6.11 弗洛伊德算法相关推荐

  1. 必会算法总结5—弗洛伊德算法

    必会算法总结(5) - 弗洛伊德算法 ​ 弗洛伊德算法又是一个图论的算法,可能有小伙伴会问,会这么多图论的算法有用吗?可以说这对于校招进大厂的小伙伴是特别重要的,而且图相对于其它的数据结构是比较复杂的 ...

  2. 最短路径三大算法——1,弗洛伊德算法floyd(复杂度O(n^3))

    目前已经更新: 1,弗洛伊德算法floyd(复杂度O(n^3)) 2,迪杰斯特拉算法dijkstra (复杂度O(最坏n^2)) 3,SPFA算法(复杂度O(n*m)) 当然,最短路径有通用的bfs, ...

  3. 最短路径之弗洛伊德算法(Floyd)——动态规划

    弗洛伊德算法(Floyd)主要针对多源最短路径,且可以解决路径中有负权的情况(不包含负权回路),但是迪杰斯特拉算法只能解决正权值的单源最短路径(可以迭代多次求多源). 1.弗洛伊德算法的基本思想 弗洛 ...

  4. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  5. 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  6. c语言 floyd优化,Floyd(弗洛伊德)算法(C语言)

    Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或有向图或负权(但不可存在负权回路)的最短路径问题,同时也被用于计算有向图的传递闭包. 算法的思路 ...

  7. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  8. Floyd-傻子也能看懂的弗洛伊德算法

    暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...

  9. 最短路径之弗洛伊德算法

    [1]为什么需要弗洛伊德算法? 带权图中单个源点到所有顶点的最短路径问题可以用<迪杰斯特拉算法>求解. 那如果要求图中每一个顶点与其它顶点之间的最短路径呢?类似可以想到的方法为: 每次以一 ...

最新文章

  1. MYSQL储存过程和储存函数和变量
  2. 基于Kebernetes 构建.NET Core技术中台
  3. Java命令学习系列(一)——Jps
  4. 基于阿里云Serverless架构下函数计算的最新应用场景详解(二)
  5. C#LeetCode刷题-队列
  6. 为什么我选择工作很难做选择_为什么公开工作(即使很难)
  7. 【华为云技术分享】十分钟从入门到精通(下)——OBS权限配置
  8. 苹果挥刀,iPhone 12 mini要换处理器了,无缘A14!
  9. html设置referer防盗链,referer与防盗链
  10. Python 安装modules问题及import问题
  11. 《精通Spring4.X企业应用开发实战》读后感第六章(国际化)
  12. 一份针对于新手的多线程实践
  13. php检测http状态码,分享一段php判断url http状态码的代码
  14. 初级java程序员面试题大全_Java初级程序员面试题大全
  15. c++: internal compiler error: 已杀死 (program cc1plus)的解决方法
  16. 第九届河南省程序设计大赛 D 导弹发射
  17. 三面阿里拿下Offer,总结与面试官交锋两个半小时的面经。
  18. springboot mybatis 分页
  19. 王垠 我和Google的故事
  20. Ajax之父Jesse James Garrett在adaptive path工作坊上的演讲《用户体验的要素》

热门文章

  1. web前端培训机构出来的能找到工作吗?30道Web前端面试题收藏版
  2. Android多人视频聊天应用的开发(二)一对一聊天
  3. 春节小游戏之图片分类(Pytorch模型部署)
  4. 输入一个整数,求各位之和
  5. 庞加莱 (Jules Henri Poincaré)
  6. Keil5新建STM32工程(二)
  7. Ubuntu下视频播放加速软件SMPlyer
  8. 基于改进通道注意力和多尺度卷积模块的蛋白质二级结构预测
  9. 关于pip安装virtualenv虚拟环境出现的Permission denied问题及虚拟环境安装步骤
  10. Spring源码分析之AOP源码分析