贪心算法之Dijkstra单源最短路径问题

Dijkstra 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法,由计算机科学家 Edsger Dijkstra 于 1956 年构思并于 1959 年发表。其解决的问题是:给定图 G 和源顶点 v,找到从 v 至图中所有顶点的最短路径

Dijkstra 算法采用贪心算法(Greedy Algorithm)范式进行设计。

Dijkstra 算法描述

1. 设计合适的数据结构。设置带权邻接矩阵C,设源点为u,x为源点外任意顶点,即如果<u,x>∈E,令C[u] [x]等于<u,x>的权值,否则,C[u] [x]=0;采用一维数组dist来记录从源点到其他顶点的最短路径长度,如dist[x] 表示从源点到顶点x的路径长度,采用一维数组p来记录最短路径。

2. 初始化。令集合S = { u },对于集合V-S中的所有顶点x,设置dist[ x ] = C [ u ] [ x ](x主要只是一个符号,它可以表示集合V-S中的任一个顶点);如果顶点i与源点相邻,设置p[ i ] = u,否则p[ i ] = -1。

3. 在集合V-S中依照贪心策略来寻找使得dist[ x ] 具有最小值的顶点t,即dist[ t ] = min { dist[ x ] | x∈(V-S) },满足该公式的顶点t就是集合V-S中距离源点u最近的顶点。

4. 将顶点t加入集合S中,同时更新集合V-S。

5. 如果集合V-S为空,算法结束;否则,转步骤6。

6. 对集合V-S中的所有与顶点t相邻的顶点x,如果dist[ x ] > dist[ t ] + C [ t ] [ x ],则dist[ x ] = dist[ t ] + C [ t ] [ x ]并设置p[ i ] = t。转步骤3。

该算法过程比较简单,很好理解。接下来我们来看一个实际例子,下面的动图很好解释了算法的过程。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值