图——单源最短路径

 过程中的数组结果

1.数组d[维数=结点个数]:存放各个结点到源结点的距离,初始化为无穷大;

2.一维数组color[维数=结点个数]={WHITE,BLACK} :表示该结点是否被访问(非必须)

3.一维数组pred[维数=结点个数]:存放各个结点的父结点

4.优先队列Q

Dijkstra(G, w, s)
#输入 G:图 W:为图中边的权重,二维数组,用来存放边的权重 s:源结点
Input: A graph G, a matrix w representing the weights between vertices in G, source vertex s
Output: None
步骤1:构建一维数组d[V]:存放到原点的距离,初始化为无穷大,color[V]
for 𝑢 ∈ 𝑉 do
    𝑑[𝑢] ← ∞, 𝑐𝑜𝑙𝑜𝑟[𝑢] ←WHITE;  
end
步骤2:将源结点到源结点的距离置为0,并将父结点置为NULL
𝑑[𝑠] ← 0;
𝑝𝑟𝑒𝑑[𝑠] ← NULL;
步骤3:将所有结点,以及结点的距离 放到优先队列Q中
𝑄 ← queue with all vertices;
步骤4:循环遍历直到队列Q为空
While 𝑁𝑜𝑛-𝐸𝑚𝑝𝑡𝑦(𝑄) do   // Process all vertices
    步骤4.1 返回队列Q中距离最小的结点u
    𝑢 ←Extract-Min(𝑄); // Find new vertex
    步骤4.2 遍历u所有子结点,更新子结点的距离
    for 𝑣 ∈ 𝐴𝑑𝑗[𝑢] do
        if 𝑑 [𝑢] + 𝑤 [𝑢, 𝑣] < 𝑑[𝑣] then // If estimate improves
            𝑑 [𝑣]← 𝑑 [𝑢] + 𝑤 [𝑢, 𝑣 ]; // relax
            Decrease-Key(Q, 𝑣, 𝑑[𝑣]);      #更新队列结点的距离
            𝑝𝑟𝑒𝑑 [𝑣] ← 𝑢;
        end
    end
    步骤4.3 子结点遍历完成后,将该结点颜色置为BLACK,
    𝑐𝑜𝑙𝑜𝑟[𝑢] ← BLACK;
end

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值