对于有向无环图DAG,我们可以利用先拓扑排序得到顶点的一个序列,然后按照此序列进行最短路径的推进(更新当前顶点的邻接顶点的dist值),如 图的邻接表数组实现及其应用

对于有环图,通常使用的是Dijkstra算法的技术,即每次选择在 没被选择过(unknown,false)的顶点中 当前dist 最小的顶点,然后将其置为已选择(如 visited[ i ] = true;),再进行最短路径的推进(更新当前顶点的邻接顶点的dist值,以供下次选择使用),这样就可以避免重复选择。

对于最短路径,最重要的就是已经选择过的顶点一定不能重复选择或参与以后的运算(dist值的更新),而上面两种策略就是解决这一问题的良药。

预备知识:

邻接矩阵:表示图的一种方法,是一个二维数组。用一个一维数组存放图中所有顶点数据;用一个二维数组存放顶点间关系(边)的数据,这个二维数组称为邻接矩阵。对于每条边(u , v),我们置A[u][v]=1;否则,置为0.如果边有一个权,我们可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。

注意,无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵一般不对称。

单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。

1.最短路径的最优子结构性质

该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。

假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)<P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。

2.Dijkstra算法描述

由上述性质可知,如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点。那么(Vi...Vk)也必定是从i到k的最短路径。为了求出最短路径,Dijkstra就提出了以最短路径长度递增,逐次生成最短路径的算法。譬如对于源顶点V0,首先选择其直接相邻的顶点中长度最短的顶点Vi,那么当前已知可得从V0到达Vj顶点的最短距离dist[j]=min{dist[j],dist[i]+matrix[i][j]}。

根据这种思路,假设存在G=<V,E>,源顶点为V0,U={V0},dist[i]记录V0到i的最短距离,path[i]记录从V0到i路径上的i前面的一个顶点。
1.从V-U中选择使dist[i]值最小的顶点i,将i加入到U中;
2.更新与i直接相邻顶点的dist值。(dist[j]=min{dist[j],dist[i]+matrix[i][j]})
3.直到U=V,停止。

3.代码如下

void DijkstraPath(MGraph g,int *dist,int *path,int v0) //v0表示源顶点
{int i,j,k;bool *visited=(bool *)malloc(sizeof(bool)*g.n);for(i=0;i<g.n;i++)      //初始化 {if(g.matrix[v0][i]>0&&i!=v0){dist[i]=g.matrix[v0][i];path[i]=v0;     //path记录最短路径上从v0到i的前一个顶点 }else{dist[i]=INT_MAX;    //若i不与v0直接相邻,则权值置为无穷大 path[i]=-1;}visited[i]=false;}path[v0]=v0;dist[v0]=0;              //这一句很重要for(i=0;i<g.n;i++) { int min=INT_MAX; int u=v0; //为了第一次循环而必须赋值 for(j=0;j<g.n;j++) //寻找未被扩展的权值最小的顶点 { if(visited[j]==false&&dist[j]<min) { min=dist[j]; u=j; } }visited[u]=true;for(k=0;k<g.n;k++) //更新dist数组的值和路径的值 { if(visited[k]==false&&g.matrix[u][k]>0&&min+g.matrix[u][k]<dist[k]) { dist[k]=min+g.matrix[u][k]; path[k]=u; } } }
}

关于代码的解释和演示如下图所示:

原文地址:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html
                    http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html

Dijkstra算法(单源最短路径)相关推荐

  1. 你必须会的--Dijkstra算法--单源最短路径问题

    文章目录 一.算法原理 1.基本原理 2.如何保存最短路径? 二.算法实战一 1.测试 2.结果 二.算法实战2 Input Output Sample Input Sample Output 一.算 ...

  2. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  3. dijkstra 算法_数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  4. Dijkstra(迪杰斯特拉)算法(单源最短路径算法)的理解

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

  5. 图的最短路径之Dijkstra求单源最短路径算法(C++)

    一个有向带权图求它的单源最短路径可以使用Dijkstra算法. 单源最短路径是指:从图中的某个顶点出发,到其余各个顶点权值最小的路径. Dijkstra算法需要用到三个辅助数组: dist[max]: ...

  6. c语言单元最短路径贪心算法,单源最短路径 贪心算法

    <单源最短路径 贪心算法>由会员分享,可在线阅读,更多相关<单源最短路径 贪心算法(3页珍藏版)>请在人人文库网上搜索. 1.实验三 单源最短路径一.实验目的及要求掌握贪心算法 ...

  7. 贪心算法最短路径java_贪心算法-单源最短路径

    算法思想:贪心算法 实际问题:单源最短路径 编程语言:Java 问题描述 单源最短路径算法,又称迪杰斯特拉算法.其目的是寻找从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题. 算法构 ...

  8. Dijkstra 求单源最短路径

    #include "stdafx.h" #include <iostream> using namespace std ;#include <vector> ...

  9. Dijkstra算法 迪杰斯特拉算法 单源最短路径

    写在前边的话:你的支持是我写作的动力,有帮助到你的话麻烦点赞加收藏呦.感激不尽!如有错误也请留言指正. 考研数据结构练习,欢迎订阅我的专辑<考研数据结构题型分类讲解练习> [东南大学200 ...

  10. [召集令]-Dijkstra的单源最短路径算法

    2021.3.10 题目背景 墨家家主发出召集令,所有弟子得迅速到指定地点集合. 题目描述 给定一张地图,含有n个地点(n<=10000),地点从1开始编号,地图上还含有m条单向路(m<= ...

最新文章

  1. 在jsp中点击按钮,在bean中把已经查出的数据,生成csv文件,然后在ie中自动打开
  2. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)
  3. 如何读取超大文本文件
  4. 评价的等级优良差_满意程度等级划分
  5. web播放器-jwplayer
  6. jQuery实现文本框回车键转tab键
  7. Cesium:entity闪烁(点、面以及billboard)
  8. 使用openssl实现AES CBC 128 pcks7加密
  9. 微积分总结(数列与无穷级数)
  10. oracle蓝屏解决方法,win10系统蓝屏怎么办 蓝屏代码0x000007e的3种解决方法
  11. css 背景重复渐变_CSS3重复渐变[CSS3提示]
  12. 上升沿判断语句_股票上升趋势中回调买入技巧,强势股顺势横盘突破买入法
  13. windows编程学习感悟
  14. 国开电大 钢--混凝土组合结构 形成性考核1-4
  15. 电脑蓝牙无法搜索到其它蓝牙设备
  16. Linux安装CentOS系统
  17. typora+百度云盘+markor实现多端云同步
  18. CV10 图像模糊(均值、高斯、中值、双边滤波)
  19. matlab死亡时间推测实验,尸检——关于死亡时间推测的基本手法及操作方式
  20. 和平精英微信名片服务器繁忙,和平精英微信游戏名片是什么 微信游戏名片设置方法一览[多图]...

热门文章

  1. 2021年全球无水氢氟酸收入大约3120.8百万美元,预计2028年达到3634.6百万美元
  2. 港口数字化转型不能盲目跟风
  3. Memcache教程
  4. Android 选择器 PickerView实例,时间选择器、地址选择器、单项选择器、多项选择器自定义布局
  5. BZOJ2876: [Noi2012]骑行川藏
  6. 数据中台建设方法论-4 实践
  7. 各类Java高质量学习网址
  8. Java语言与C语言的区别
  9. 用OutLook发手机短信
  10. VBS整人蓝屏代码(Windows 7 直接蓝屏,重启即可恢复,亲测有效!!)