【算法】单源最小生成路径与Dijistra算法


title: Dijistra
date: 2023-11-16 20:32:49
tags: algorithm


单源最小路径问题

问题描述

单源最小路径问题描述了一个n结点的有向图G中一个点v0到各个结点的最小路径问题。如图:

在这里插入图片描述

Dijistra法利用贪心选择性质和最优子结构找到局部最优解来保证整体最优解,下面我们来介绍一下Dijistra法。

Dijistra算法

假设已经构造i条最短路径,下一条生成的路径是下一条的最短路径。

描述最短路径的生成规则:按照非降次序依次生成v0到个节点的路径

设集合S是已经生成v0到各节点的最短路径的结点集合,设u是S外一点,dist(u)是经过S中结点,且在u结点结束的路径的长度**。

在这里插入图片描述

  • 设w是从v0到u的路径上的结点,由于到u的路径一定经过S中的结点,根据生成规则,按非降次序生成最小路径,所以w一定在S集合中,所以在v0到u的路径上的点都已经生成最小路径;
  • 生成的下一条路径的终点u是S外dist(u)最小的结点(按非降次序);
  • 如果找到这样的u且生成了从v0到u的最短路径,将u加入集合S。此时从v0经过u终点为S外一点u的最小路径可能会变小,因为可能经过u到w的路径更短,这时dist(w) = min(dist(w),dist(u) + c(u,w))。

代码

#Dijistra法解决单源最小路径问题
#描述一个邻接矩cost(n,m)代表有向图中n到m之间的距离,没有连线的为无限大
#v是存放结点的数组,n是结点的个数,dist是从v0到某一点的最短路径
def SHORT-PATH(v,cost,dist,n):
	S = [False]*n;
	for i in range(n):
		
		dist[i] = 0
		#false代表不在S里,true代表在S里
		s[i] = false
	s[v] = True
    dist[v] = 0
    
    for num in range(2,n-1):
        #按非降次序选入不在S中的(还没有生成最小路径的)dist[x],找到dist[x]最小的结点x
        u = min((i for i in range(n) if not s[i]),key = lambda x:dist[x])
        s[u] = true
        
        for w in range(n):
            if not s[w]:
                dist[w] = min(dis[w],dist[u] + cost[u][w])

例题

在这里插入图片描述

迭代选取的结点Sdist(1)dist(2)dist(3)dist(4)dist(5)dist(6)dist(7)
初始化-10205030MAXMAXMAX
121,20204530MAX90MAX
241,2,402045308590MAX
331,2,3,402045307090MAX
451,2,3,4,502045307080140
561,2,3,4,5,602045307080130

建议手推一遍,发现dist[u]来自要么是上一个生成的最小路径加上上一个最小路径的终点到u的距离和,要么是从v0到u的距离dist[u](不连通就是无限大)。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值