【贪心算法】单源最短路径Python实现

问题描述

  • 给定一个带权有向图 G = ( V , E ) G = (V , E) G=(V,E),其中每条边的权是非负实数,给定 V V V中的一个顶点,称为源
  • 计算从源到所有其他各顶点的最短路径长度

Dijkstra算法

  • Dijkstra算法是解单源最短路径问题的一个贪心算法
  • 其基本思想是,设置顶点集合 S S S,并不断地做贪心选择来扩充这个集合,一个顶点属于集合 S S S当且仅当从源到该顶点的最短路径长度已知
  • 初始时, S S S中仅含有源,设 u u u G G G的某一个顶点,把从源到 u u u且中间只经过 S S S中顶点的路称为从源到 u u u的特殊路径,并用数组 d i s t dist dist记录当前每个顶点所对应的最短特殊路径长度,用数组 p a r e n t [ i ] parent[i] parent[i]记录从源到顶点 i i i的最短路径上 i i i的前一个顶点
  • Dijkstra算法每次从 V − S V - S VS中取出具有最短特殊路长度的顶点 u u u,将 u u u添加到 S S S中,同时对列表 d i s t dist dist p a r e n t parent parent做必要的修改,当 d i s t [ u ] + g r a p h [ u ] [ i ] < d i s t [ i ] dist[u] + graph[u][i] < dist[i] dist[u]+graph[u][i]<dist[i]时,置 d i s t [ i ] = d i s t [ u ] + g r a p h [ u ] [ i ] dist[i] = dist[u] + graph[u][i] dist[i]=dist[u]+graph[u][i],置 p a r e n t [ i ] = u parent[i] = u parent[i]=u
  • 一旦 S S S包含了所有 V V V中顶点, d i s t dist dist就记录了从源到所有其他顶点之间的最短路径长度

Dijkstra算法的正确性

贪心选择性质
  • Dijkstra算法所做的贪心选择是从 V − S V - S VS中选择具有最短特殊路径的顶点 u u u,从而确定从源到 u u u的最短路径长度 d i s t [ u ] dist[u] dist[u],从源到 u u u没有更短的其他路径
  • 事实上,如果存在一条从源到 u u u且长度比 d i s t [ u ] dist[u] dist[u]更短的路,设这条路初次走出 S S S之外到达的顶点为 x ∈ V − S x \in V - S x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值