数据结构与算法-100 days of learning-day1

有权图的单源最短路算法
在这里插入图片描述
如上图所示,左边这个有权图中,要找到v1到v6这两个顶点的最短路径,可以按照递增的顺序找出到各个顶点的最短路(也就是Dijkstra 算法)。但该算法不适用于负值圈,也就是上图中右边的有权图。如果把每条边的权看做“金钱”,那么为了花费最少,他可以按照图示走无数次。
Dijkstra 算法具体描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
图 6
相关结论
若路径是按照递增(非递减)的顺序生成的,则
1.真正的最短路必须只经过集合S中的顶点。
这里可以采用反证法来看其正确性。假设最短路不是必须只经过集合S中的顶点。如图6左边的图所示,顶点w为集合S之外且可令dist[v]最小的顶点。那么这种情况下最短路径为s->w->v,显然s->w的距离小于s->v的距离。然而,与之相矛盾的是,路径是按照递增的顺序生成的。那么此时顶点w应该是被收在集合S中的顶点了,因为它是相较于顶点v,距离源点s更近的顶点。所以,假设不成立。
2.每次从未收录的顶点中选一个dist最小的收录(贪心)。
3.增加一个v进入S,可能影响另外一个w1的dist值!
从这里可以看出以下两点:
1)v一定在s到w1的路径上。
2)v到w1一定有一条直接相连的边,或者说w1一定是v的邻接点。
同样是反证法。如图6右边的图所示,假设v到w1的路径上有一个顶点v1。那么由于路径是按照递增的顺序生成的,所以说源点s到v1的距离一定大于s到v的距离。而dist[w]指的是s到w的最短路径长度,而且该路径所经过的顶点肯定都属于集合S。顶点v是最新加入的顶点,所以除了顶点w1,v就是距离源点s最远的顶点。既然v1相较于v来说,离源点s更远,那么它一定不属于集合S。所以说v到顶点w1的路径上没有其他顶点。
所以新加入一个v到集合S中,可能会影响到其邻接点的dist值。就是这个语句一样,dist[w] = min{dist[w], dist[v] + <v,w>的权重},当dist[v] + <v,w>的权重小于dist[w]时,更新dist[w]的值。
算法描述
在这里插入图片描述
在这里插入图片描述
执行该程序时,首先需要传入源点s。先从dist数组当中找出dist值最小得所对应的顶点v并将其收到collected数组中。因为路径是按照递增的顺序生成的,那么首先要开始搜索源点s的邻接点。如果有其邻接点v未被收录,则看 dist[s]+E<s,v>是否小于 dist[v]。同理,如果小于,则更新dist[v]的值,则为dist[v] = dist[s] + E<s,v>,然后记录源点s。在将源点s的邻接点均遍历之后,跳出内层循环。继续寻找剩余未被收录的顶点中dist最小的。然后遍历其邻接点。以此规律不断循环。直到所有点均被收录为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值