Dijkstra算法|单源最短路径|贪心算法
单愿最短路径描述:给定带权有向图G=(V,E),其中每条边的权是非负实数。另外,还给定V中的一个顶点,称之为源(origin)。现在要计算从源到其他各顶点的最短路径的长度。这里的路径长度指的是到达路径各边权值之和。
Dijkstra算法是解单源最短路径问题的贪心算法。Dijkstra算法的基本思想是:设置顶点集合S并不断地做贪心选择来扩充集合。一个顶点属于集合S当且仅当从源点到该顶点的最短路径长度已知。贪心扩充就是不断在集合S中添加新的元素(顶点)。
初始时,集合S中仅含有源(origin)一个元素。设curr是G的某个顶点,把从源到curr且中间只经过集合S中顶点的路称之为从源到顶点curr的特殊路径,并且使用数组distance记录当前每个顶点所对应的最短路径的长度。Dijkstra算法每次从图G中的(V-S)的集合中选取具有最短路径的顶点curr,并将curr加入到集合S中,同时对数组distance进行必要的修改。一旦S包含了所有的V中元素,distance数组就记录了从源(origin)到其他顶点的最短路径长度。
算法演示[演示素材来源于网络|点击下载]
核心代码:
Dijkstra描述:带权有向图G=(V,E),V={1,2,3,…}。顶点origin是源。数组distance[index]表示当前源到顶点index的最短路径长度。数组prev[index]表示源点到达index顶点最短路径的前一个顶点[Dijkstra只能获取最短路径的长度,通过prev记录前驱顶点可以很方便的获取详细的最短路径]。
数据结构与代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
public struct DIJGraph
{
public int [] vexs; //顶点信息
public int [][] arcs; //边的权值
public int num; //顶点数目
}
public static bool DIJKSTRA( int origin,DIJGraph g,
int [] distance, int [] prev)
{
if (origin < 0 || origin >= g.num)
return false ;
bool [] s = new bool [g.num];
for ( int index = 0; index < g.num; ++index)
{
s[index] = false ;
distance[index] = g.arcs[origin][index];
prev[index] = (distance[index] == Int32.MaxValue) ? -1 : origin;
}
distance[origin] = 0;
s[origin] = true ;
for ( int i = 0; i < g.num; ++i)
{
int temp = Int32.MaxValue;
int curr = 0;
for ( int index = 0; index < g.num; ++index)
{
if (!s[index] && distance[index] < temp)
{
curr = index;
temp = distance[index];
}
}
s[curr] = true ;
for ( int index = 0; index < g.num; ++index)
{
if (!s[index] && g.arcs[curr][index] < Int32.MaxValue)
{
int newDistance = distance[curr] + g.arcs[curr][index];
if (newDistance < distance[index])
{
distance[index] = newDistance;
prev[index] = curr;
}
}
}
}
return true ;
}
|
贪心选择性质|最优子结构性质是Dijkstra算法所具备的。不过,虽然Dijkstra算法是解决单源最短路径的一款很优秀的算法,但是如果在图中存在多条最短路径,Dijkstra算法只能获取路径的长度,而无法给出最短路径的详细情况。即使在代码中添加distance[index]表示当前源到顶点index的最短路径长度。数组prev[index]来记录前驱点,但是一旦存在多条最短路径,我们只能获取最先遇到的那条(或者最后遇到的那条路径)[往往,我们偏向于获取的是最短路线而非路长]。总之,Dijkstra算法还有许多改进的地方。
本文提供的核心代码使用C#实现,您可以点击下载获取源代码[点击下载C语言实现代码]。
Dijkstra算法|单源最短路径|贪心算法相关推荐
- c语言单元最短路径贪心算法,单源最短路径 贪心算法
<单源最短路径 贪心算法>由会员分享,可在线阅读,更多相关<单源最短路径 贪心算法(3页珍藏版)>请在人人文库网上搜索. 1.实验三 单源最短路径一.实验目的及要求掌握贪心算法 ...
- 用java单源最短路径问题_单源最短路径-贪心算法
单源最短路径,关于这个问题的贪心算有点不好理解,分析后续补充,代码也需要后续优化,便于理解 package test; import java.util.ArrayList; import java. ...
- 你必须会的--Dijkstra算法--单源最短路径问题
文章目录 一.算法原理 1.基本原理 2.如何保存最短路径? 二.算法实战一 1.测试 2.结果 二.算法实战2 Input Output Sample Input Sample Output 一.算 ...
- 数据结构与算法—单源最短路径dijkstra算法
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- 贪心算法最短路径java_贪心算法-单源最短路径
算法思想:贪心算法 实际问题:单源最短路径 编程语言:Java 问题描述 单源最短路径算法,又称迪杰斯特拉算法.其目的是寻找从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题. 算法构 ...
- dijkstra 算法_数据结构与算法—单源最短路径dijkstra算法
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- Dijkstra(迪杰斯特拉)算法(单源最短路径算法)的理解
介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...
- 图的最短路径之Dijkstra求单源最短路径算法(C++)
一个有向带权图求它的单源最短路径可以使用Dijkstra算法. 单源最短路径是指:从图中的某个顶点出发,到其余各个顶点权值最小的路径. Dijkstra算法需要用到三个辅助数组: dist[max]: ...
- 图算法:2、计算带有负权值的单源最短路径:Bellman-Ford算法
原文地址:http://www.wutianqi.com/?p=1912 相关文章: 1.Dijkstra算法: http://www.wutianqi.com/?p=1890 2.Floyd算法: ...
- 单源最短路径bellman算法
介绍 在一个权重,有向图G=(V,E)中,连接所有顶点且拥有最小权重值的路径是此图的单源最短路径.单源最短路径可以解决许多最短路径问题的变种:如一个顶点到其它所有顶点最短距离,2个顶点对之间的最短距离 ...
最新文章
- ARM通用NEON多媒体处理SIMD引擎
- 【Sass】全面的 Sass 教程及学习笔记
- 如何为每个URL连接设置自定义SSLSocketFactory的TrustManager
- java注释修改_java – 使用注释修改方法
- 计算机双行文本一般应用在什么地方,全国计算机二级MS office操作试题及答案
- 日本区块链项目Jasmy与索尼VAIO联合发售笔记本电脑
- CentOS 升级现有PHP版本
- 数据结构(C语言版第二版)思维导图
- 麦本本笔记本怎么U盘重装Win10系统教学?
- coon.php连接,CoonClient.php
- FPGA 名词解释(FPGA WORD EXPLANATION )
- Pytorch Image Models (timm)
- 部分手机打开USB调试,安装失败解决办法
- 蓝字冲销是什么意思_红字和蓝字冲销
- python延时函数 微秒_Python程序可显示当前时,分,秒和微秒
- rj45插座尺寸图_带灯RJ45插座接口定义及使用说明
- 什么是JDBC,什么是JdbcTemplate
- 让两个线程有先后执行顺序
- wordpress新闻杂志主题Newspaper中文版
- TextMate添加Erlang支持
热门文章
- 无法卸载K/3处理方法
- Linux O(1)调度器
- oracle in like组合,IN操作符与LIKE子句-各种查询
- python除数为0报错_python 错误捕获机制分析
- python 异常处理小结 try except raise assert
- java.io.IOException: Filesystem closed
- SLAM学习笔记-------------(九)后端1
- php如何实现跳转,php怎么实现页面跳转?
- vue检测是不是360浏览器兼容模式_Vue项目兼容IE11
- python模拟操作_请用Python如何模拟键盘操作