Dijkstra+堆优化

目录

一.Dijkstra

1.思想

2.禁区

二.朴素Dijkstra

三.Dijkstra+堆优化(优先队列)

1.思想

2.实践

(1)小根堆(大根堆重载)

(2)Dijkstra函数


一.Dijkstra

1.思想

想必Dijkstra的思想大家都知道吧,就是单源点最短路径

2.禁区

注意,Dijkstra不能处理负权边,因为一旦它遇上负权边就会出现如下情况:

Dijkstra的算法会先从2和3号点中选择出最近的2号点进行松弛,因而把2号点就标记了,当第三次松弛三号点的时候就不能走2号点,从而就错过了最短路,有点像贪心。Dijkstra给出的最短路是从1号点走到2号点,再到三号点,从而最短路径是15,然而真实的最短路径是12。

二.朴素Dijkstra

直接上代码:

for (int i = 1; i <= n; i ++)//G数组就是图,是邻接矩阵
    dis[i] = G[s][i];//初始化
head[s] = s;
vis[s] = 1;
dis[s] = 0;
for (int i = 1; i < n; i ++){
    int k = 0, smin = INF;
    for (int j = 1; j <= n; j ++)
        if (!vis[j] && dis[j] < smin){
            smin = dis[j];
            k = j;
        }
    if (!k)
        break;
    vis[k] = 1;
    for (int j = 1; j <= n; j ++){
        if (dis[j] > dis[k] + G[k][j]){
            dis[j] = dis[k] + G[k][j];
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值