图的最短路径

带权图的最短路径

从某顶点(源点)出发到另一顶点(目的点)的路径中,有一条各边(或弧)权值之和最小的路径称为最短路径。

  1. 从单源点到其余各点的最短路径 迪杰斯特拉算法(Dijkstra)
  2. 每一对顶点之间的最短路径 弗洛伊德算法 (Floyd)

迪杰斯特拉(Dijkstra)算法

迪杰斯特拉(Dijkstra)算法:

依最短路径的长度递增的次序求得各条路径。

其中,从源点v0到顶点vi的最短路径是v0到各点路径集合长度中长度最短者。

路径长度最短的最短路径的特点:

在这条路径上,必定只含有一条弧,并且这条弧的权值最小。(设为v0->vk)

下一条路径长度次短的最短路径特点:

它只可能有两种情况:或者是直接从源点到该点vi(只含一条弧);或者是从源点经过顶点vk,再到达vi(由两条弧组成)。

再下一条路径长度次短的最短路径特点:

它可能有两种情况:或者是直接从源点到该点(只含一条弧);或者是从源点经过顶点vk,vi再到达该顶点(由多条弧组成)

其余最短路径:

它或者是直接从源点到该点(只含一条弧);或者是从源点经过已求得最短路径的顶点,再到达该顶点

迪杰斯特拉(Dijkstra)算法的基本思想:

  1. 初始时,集合S中仅包含源点v0,集合V-S中包含除源点v0以外的所有顶点。v0到V-S中各顶点的路径长度或者为某个权值(如果它们之间有弧相连),或者为无穷(没有弧相连)。
  2. 按照最短路径长度递增的次序,从集合V-S中选出到顶点V0路径长度最短的顶点vk加入到S集合中。
  3. 加入vk之后,为了寻找下一个最短路径,必须修改从v0到集合V-S中剩余所有顶点vi的最短路径。若在最短路径上加入vk之后,使得v0到vi的路径长度比原来没有加入vk时的路径长度短,则修正v0到vi的路径长度为其中较短的。
  4. 重复以上步骤,直至集合V-S中的顶点全部被加入到集合S中为止。

存储结构

  1. 带权邻接矩阵用g.arcs[ ] [ ]表示:

    用g.arcs[i] [j].adj表示弧<vi,vj>上的权。

  2. 将顶点分为两组:S,V-S

    S中存放已求得最短路径的终点的集合。

  3. 借助辅助一维数组dist[ ]

    若vi属于S,dist[i]表示源点到vi的最短路径长度

    若vi属于V-S,dist[i]表示源点到vi的只包括S中的顶点为中间顶点的最短路径。

    初始:S={v0},v0为源点

    ​ dist[i]=g.arcs[0] [i].adj; (vi属于V-S)

  4. 二维数组path[] [ ]记录某顶点是否加入到集合S中

    如果path[i] [0] = 1,

    则表示顶点vi加入到集合S中,并且path[i]所在的行最终记录了源点到vi的最短路径上的各个顶点。

    否则,path[i] [0]=0,则表示顶点vi还在集合V-S中。

代码实现:

void Dijkstra(AdjMatrix *G,int start,int end,int dist[],int path[][MAXVEX]){int mindust,i,j,k,t=1;for(i=1;i<=G->vexnum;i++){dist[i]=G->arcs[start][i];if(G->arcs[start][i]!=INFINITY)path[i][1]=start;}path[start][0]=1;for(i=2;i<=G->vexnum;i++){mondist=INFINITY;//选择最小权值的路径for(j=1;j<=G->vexnum;j++)if(!path[j][0]&&dist[j]<mindist){k = j;mindist = dist[j];}if(mindist==INFINITY) return;path[k][0]=1;for(j=1;j<=G->vexnum;j++){if(!path[j][0]&&G->arcs[k][j]<INFINITY&&dist[k]+G->arcs[k][j]<dist[j]){dist[j]=dist[k]+G->arcs[k][j];t=1;while(path[k][t]!=0){path[j][t]=path[k][t];t++;}path[j][i] = k;path[j][t+1] = 0;}}}
}


开心完结撒花!!!!

学习笔记: 图的最短路径相关推荐

  1. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  2. Word 【域】学习笔记 - 图/表题注

    Word [域]学习笔记 - 图/表题注 插入题注 章节(标题)号 标题设置编号 引用标题级别 问题 错误!文档中没有指定样式的文字 参考资料 插入题注 引用 > 插入题注 或 右键 > ...

  3. 数据结构学习笔记------图

    主要掌握深度优先搜索与广度优先搜索的程序设计 掌握图的基本概念及基本性质(度.路径长度.回路.路径等).图的存储结构及其特性. 存储结构之间的转化.基于存储结构上的遍历操作和各种应用 (拓扑排序:AO ...

  4. 数据结构(c++)学习笔记--图的应用

    文章目录 一.双连通分量 1.判定法则 2.算法 3.实例 二.优先级搜索 1.通用算法 2.算法 3.复杂度 三.Dijkstra算法 1.最短路径 2.最短路径树 3.实例 4.实现 四.Prim ...

  5. 数据结构与算法学习笔记——图(Graph)

    什么是图: 无向图:可以理解QQ中的互加好友 无向图: 可以理解为微博中的关注 图的一些概念: 顶点:图中的元素(A,B,C,D....) 边: 图中的一个顶点可以与任意其他顶点建立连接关系,这种建立 ...

  6. 算法学习笔记五:最短路径

    题目描述 卫斯理小说经常提及外星人,比如蓝血人. 在土星星球有很多城市,每个城市之间有一条或多条飞行通道, 但是并不是所有的路都是很安全的,每一条路有一个安全系数 s,s 是在 0和1 间的实数 (包 ...

  7. 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    目录 一.图的遍历概念 二.深度优先搜索(DFS) (一)DFS算法步骤 1.邻接表DFS算法步骤 2.邻接矩阵DFS算法步骤 (二)深度优先生成树.森林 (三)DFS的空间复杂度和时间复杂度 三.广 ...

  8. Windows phone 8 学习笔记(4) 应用的启动

    Windows phone 8 的应用除了可以直接从开始菜单以及应用列表中打开外,还可以通过其他的方式打开.照片中心.音乐+视频中心提供扩展支持应用从此启动.另外,我们还可以通过文件关联.URI关联的 ...

  9. 图学习笔记(一):图

    图学习笔记(一):图与图学习 一. 图是什么? 1. 图的定义 2. 图的基本表示方法及概念 2.1 图的构成 2.2 图的概念 3. 例子:空手道俱乐部图 二. 如何存储图?存储图的方式:三种 第一 ...

最新文章

  1. Python爬无止境,获得王者荣耀全部高清皮肤
  2. hdu 5340(manacher+枚举)
  3. oracle11 不能连接,oracle11G ora 12514 tns监听程序当前无法识别连接描述符中请求的服务...
  4. php ajax mysql 出错,php – 从mysql切换到mysqli后,Ajax的更新语句不能正常工作,但没有错误显示...
  5. php授权验证系统 c,OAuth 2.0 授权码认证
  6. Latice CPLD jed转VME文件简介
  7. html window 网络邻居,windows10网上邻居共享文件0x80070035找不到网络路径
  8. 【Web技术】1395- Esbuild Bundler HMR
  9. 软件测试的系统代码,软件测试工程师管理系统代码
  10. [网鼎杯 2020 白虎组]PicDown(精讲)
  11. 内嵌汇编(ARM64)
  12. 游戏耳机怎么选购?适合玩游戏的无线蓝牙耳机品牌
  13. lisp 非对称缓和曲线_CAD画缓和曲线lisp程序
  14. python数组列表添加一行一列np.rowstack()np.column_stack()
  15. 生物医药行业可以申报高新技术企业吗
  16. java基础--java中HashMap原理
  17. php循环求1到100偶数,用while循环计算打印2到100的偶数和的几种方法
  18. 服务器swap占用过高,主机swap区使用率过高
  19. android高德地图点平滑移动,高德地图Marker平滑移动
  20. 泡妞神器Python!教你用它时刻关注女友心情变化!

热门文章

  1. mac进入linux启动盘黑屏,进入Boot OS X Install from Install OS X Mavericks后立即黑屏
  2. 如何在Instagram上保存帖子和管理收藏
  3. 计算机专业如何进单位编制,事业单位招考,进去是什么编制?
  4. 从毕业生到“造路人”:贵州城市职业学院大专毕业生的前行故事
  5. Specifying a namespace in include() without providing an app_name is not supported 记录
  6. 【个人整理】省选知识点汇总
  7. [nlp] SQuAD 数据集介绍(Q+A+原文)
  8. Syntax error on token Invalid Regular Expression Options, no accurate correc
  9. mac linux网卡驱动下载官网下载,必联BL-LW06-AR无线网卡驱动(Linux/MAC OS)
  10. 《Qt》Qt mouseMoveEvent判断左键按下