Dijkstra算法(最短路径算法)

本文深入解析了Dijkstra算法,一种用于解决带权图中单源最短路径问题的经典算法。通过使用优先队列优化,提高了算法效率。文章详细介绍了算法的实现过程,包括初始化距离、维护优先队列、更新距离和父节点等关键步骤。
import heapq
import math

graph={
    "A":{"B":5,"C":1},
    "B":{"A":5,"C":2,"D":1},
    "C":{"A":1,"B":2,"D":4,"E":8},
    "D":{"B":1,"C":4,"E":3,"F":6},
    "E":{"C":8,"D":3},
    "F":{"D":6}
}

def init_distance(graph,s):
    distance={s:0}
    for v in graph:
        if v!=s:
            distance[v]=math.inf
    return distance
print(init_distance(graph,"A"))

def dijkstra(graph,s):
    pqueue=[]
    heapq.heappush(pqueue,(0,s))
    seen= set()
    parent={s:None}
    distance=init_distance(graph,'A')
    
    while( len(pqueue)>0 ):
        pair= heapq.heappop(pqueue)
        dist= pair[0]
        v = pair[1]
        seen.add(v)
        
        nodes = graph[v].keys()
        for n in nodes:
            if n not in seen:
                if dist+ graph[v][n]< distance[n]:
                    heapq.heappush(pqueue,(dist+graph[v][n],n))
                    parent[n]=v
                    distance[n]= dist+ graph[v][n]
    return parent,distance

parent,distance= dijkstra(graph,"A")
print(parent,distance)

BFS算法扩展。将queue方式换成优先队列。

dijkstra算法:从图上一点到另一点最短路径,图为DAG,带权或路径长度。

从优先队列里拿取没有拿出来的,更新parent数组和distance数组,parent数组的个元素表示为链表。distance为原点到个个节点的路径长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值