如果要得到图中各个顶点之间的最短路径,方法1:可以对每一个顶点采用Dijkstra算法;方法2:可以采用Floyd算法,它是一种用来求双源点之间最短路径的算法,采用邻接矩阵来存储图

辅助结构
int D[maxSize][maxSize];//表示从各个顶点之间最短路径长度

例:D[i][j]:表示从i顶点到j顶点的最短路径长度

bool p[maxSize][maxSize][maxSize];//表示最短路径上的结点
p[i][j][u] = true;//u顶点存在于从i到j最短路径上
简单示例

输入为下图:

4 11 4 11 4 6 4 6
D 6 2 6 2 6 2 5 2
3 3 7 3 7 3 7
\ AB AC \ AB AC \ AB ABC \ AB ABC
p BA \ BC BA \ BC BA \ BC BCA \ BC
CA CB \ CA CAB \ CA CAB \ CA CAB \

一:初始的D数组为各点之间的权值,p表示各点之间最短路径所包含的结点
二:加入A点为各点之间的中转点,对两个数组进行更替,用黄色字体标出
三:加入B点…
四:加入C点…
当所有点都被做为过中转点,算法结束

Floyd算法
void floyd(mGraph& G)
{int i, j, u;//初始化for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){D[i][j] = G.arc[i][j];for (u = 0; u < G.vexnum; ++u)p[i][j][u] = false;if (D[i][j] < infini)p[i][j][i] = p[i][j][j] = true;}//更新数组,存储路径for (u = 0; u < G.vexnum; ++u)for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j)if (i!=j&&D[i][u] + D[u][j] < D[i][j])//对每个结点对加入u结点进行判断{D[i][j] = D[i][u] + D[u][j];for (int v = 0; v < G.vexnum; ++v)p[i][j][v] = p[i][u][v] || p[u][j][v];}
}
完整示例

将上面的图作为输入:

#include<iostream>
#define infini INT_MAX/3//最大值不选取INT_MAX,是防止溢出
#define maxSize 3//顶点数目
#define MAX 5//边的个数
//邻接矩阵
typedef struct
{int vexnum, arcnum;//顶点数和边数char vex[maxSize];//顶点信息(字符)int arc[maxSize][maxSize];//二维数组(存储边上的信息)
}mGraph;bool p[maxSize][maxSize][maxSize];//表示最短路径上的结点
int D[maxSize][maxSize];//表示从各个顶点之间最短路径长度void floyd(mGraph& G);//求最短路径
int main()
{using namespace std;mGraph G;//邻接矩阵存储图并进行初始化G.vexnum = maxSize;G.arcnum = MAX;char vexData[maxSize] = { 'a', 'b', 'c'};//顶点信息int arcData[MAX][3] = { { 0, 1 ,4}, { 0, 2,11 }, { 1, 0 ,6}, { 1, 2,2 }, { 2, 0 ,3} };//连接的边int i, j;for (i = 0; i < G.vexnum; ++i){G.vex[i] = vexData[i];for (j = 0; j < G.vexnum; j++)G.arc[i][j] = infini;}for (i = 0; i < G.arcnum; i++)G.arc[arcData[i][0]][arcData[i][1]] = arcData[i][2];//初始化完毕cout << "求各点间最短路径: ";cout << endl;floyd(G);int c;for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){if (D[i][j] == infini){cout << "不存在" << vexData[i] << "到" << vexData[j]<< "的路径" << endl;continue;}cout << vexData[i] << "到" << vexData[j]<< "的路径长度为:" << D[i][j] << "  包含顶点:";for (c = 0; c < G.vexnum; ++c)if (p[i][j][c] == true)cout << vexData[c] << ' ';cout << endl;}cout << endl;return 0;
}
void floyd(mGraph& G)
{int i, j, u;//初始化for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){D[i][j] = G.arc[i][j];for (u = 0; u < G.vexnum; ++u)p[i][j][u] = false;if (D[i][j] < infini)p[i][j][i] = p[i][j][j] = true;}//更新数组,存储路径for (u = 0; u < G.vexnum; ++u)for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j)if (i!=j&&D[i][u] + D[u][j] < D[i][j])//对每个结点对加入u结点进行判断{D[i][j] = D[i][u] + D[u][j];for (int v = 0; v < G.vexnum; ++v)p[i][j][v] = p[i][u][v] || p[u][j][v];}
}

程序的输出结果为:

Dijkstra算法求最短路径:
https://blog.csdn.net/Little_ant_/article/details/104291049
(ps:希望大家可以多多点赞

最短路径(Floyd算法)(c/c++)相关推荐

  1. C++ 实现带权有向图的每对顶点之间的最短路径Floyd算法(完整代码)

    基本思想是: 假设求从顶点vi到vj的最短路径. 如果从vi到vj有弧,则从vi到vj存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,尚需进行n次试探. 首先考虑路径(vi, v0, ...

  2. 最短路径--Floyd算法

    Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被 ...

  3. 【最短路径Floyd算法详解推导过程】看完这篇,你还能不懂Floyd算法?还不会?...

    简介 Floyd-Warshall算法(Floyd-Warshall algorithm),是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以 ...

  4. 最短路径——Floyd算法及优化(蓝桥杯试题集)

    *对最短路径问题以及floyd算法.Dijkstra算法不是很理解的同学请移步前几篇博客~ 题目链接: http://lx.lanqiao.cn/problem.page?gpid=T15 问题描述 ...

  5. 最短路径——Floyd算法HDU Today(hdu2112)

    最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径. 算法具体的形式包括: 确定起点的最短路径问题 - 即已知起始结点,求最短路径的问题. 确定终点的 ...

  6. HDU2066 一个人的旅行【最短路径+Floyd算法】

    一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  7. 求最短路径Floyd算法的并行化(解APSP问题)

    求最短路径的串行算法在互联网上应该一搜一大堆,也非常简单,几行代码搞定.但Floyd的并行算法却很难搜到,github倒是有一些,但不容易运行成功,这里对这个算法的并行化进行详细的讲解,结合论文以及实 ...

  8. 多源最短路径--Floyd算法

    #include<iostream> #include<cstdio> using namespace std; const int INF = 0x3f3f3f3f; int ...

  9. 最短路径——Floyd算法

    1. 背景: Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算 ...

最新文章

  1. 第九届蓝桥杯java B组—第六题递增三元组(详细介绍)
  2. hdfs/hbase报错:Incomplete HDFS URI, no host
  3. struct __POSITION{}和ASSERT
  4. 明晰C++内存分配的五种方法的区别
  5. ReviewForJob——希尔排序(缩小增量排序)之塞奇威克增量序列
  6. mysql获取离当前数据最近的数据_Mysql 获取最近数据信息
  7. 看日本如何用IoT打造智能工厂
  8. C语言 字符串转结构体,字符串指针转化为结构体指针!
  9. lintcode循环数组之连续子数组求和
  10. QT每日一练day4:ubuntu中使用QT
  11. QML 可以多选ComboBox的实现
  12. 从 RequireJS 到 SeaJS(3)
  13. C# NamePipe使用小结
  14. java sort 字符串_java实现6种字符串数组的排序(String array sort)
  15. 【融职教育】Web全栈工程师浸入式课程体系
  16. C/C++程序员简历
  17. ADS7830 FPGA实现
  18. 投稿论文图片分辨率达不到要求的解决方案
  19. 台州农商行计算机专业能力测试,银行/农商行笔试!刷题要刷到点子上,来这里专业老师给你出题...
  20. apple IDP 个人账户升级到公司账户(转)

热门文章

  1. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)
  2. BZOJ3574 HNOI2014抄卡组(哈希)
  3. 以Attribute加上Header验证
  4. DOT NET 三个名词
  5. MDX 中的重要概念 (MDX)
  6. 用java调用oracle存储过程总结一
  7. 关于Redis的数据迁移(三种方法)
  8. 中段尾段全段什么意思_头段?中尾段?还是全段?只要排气改对,还怕撩不到妹?...
  9. 设计模式复习-原型模式
  10. 汇编 Irvine32链接库中一些过程函数的使用说明