Dijkstra算法求由顶点a到顶点h的最短路径-算法分析与实践作业2-1

1.问题

对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径 

2.解析

用V1表示已经找到最短路径的顶点,V2表示与V1中某个顶点相邻接且不在V1中的顶点;E1表示加入到最短路径中的边,E2为与V1中的顶点相邻接且距离最短的路径。

步骤    V1          V2      E1          E2 
1.    {a}    {b}      {}          {ab}
2.    {a,b}    {d}     {ab}        {bd} 
3.    {a,b,d}       {c,f}   {ab,bd}      {dc,df}
4.    {a,b,d,c}      {f}      {ab,bd}      {df} 
5.    {a,b,c,d,f}     {e}    {ab,bd,dc,df}  {fe} 
6.    {a,b,c,d,e,f}  {g}    {ab,bd,dc,df,fe}     {eg}
7.    {a,b,c,d,e,f,g}  {h}     {ab,bd,dc,df,fe,eg}   {gh}
8.    {a,b,c,d,e,f,g,h}  {}      {ab,bd,de,df,fe,eg,gh}   {}

求所有顶点对之间的最短路径可以使用Dijkstra算法,使其起始节点从a循环到h,每次求起始节点到其他节点的最短路径,最终可以求得所有顶点对之间的最短路径。

使用二维数组作表存储顶点之间的关系。 将a比作V1,b比作V2依次类推得:
a:V0, b:V1,c:V2, d:V3, e:V4, f:V5, g:V6, h:V7
得到图:

3. 设计

伪代码

算法:Dijkstra(G,s)
//单起点最短路径的Dijkstra算法
//输入;具非负权重加权连通图G = <V , E>以及它的顶点s
//以及路径上的倒数第二个顶点pv
Initialize(Q)
for V中每一个顶点v
	dv←;pv←null
	Insert(Q, v, dv) //初始化优先队列中顶点的优先级
ds←0; Decrease(Q,s,ds) //将s的优先级更新为ds
VT←Ø
for i←0 to |V|-1 do
	u*DeleteMin(Q) //删除优先级最小的元素
	VT←VT∪{u*}
	for V-VT中每一个和u*相邻的顶点u do
		if du* + w(u*, u) <du
			du←du*+w(u*,u); pu←u*
			Decrease(Q , u, du)

实验截图:

4. 分析

[算法复杂度推导]
不会推,ԾㅂԾ,,结论:O(n^2)

5. 源码

[github源码地址]
https://github.com/Lin02993/Algorithm-Analysis-and-Practice-on-the-job

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值