堆优化迪氏最短单源路径原理及C++实现

时间复杂度

O(ElogE),E是边数。适用与稀疏图。

使用前提

边的权为正。可以非连通,非连通的距离为-1。


原理

优选队列(小根堆)记录两个数据:当前点到源点距离,当前点。先处理距离小的点;如果距离相等,先处理谁都可以。可以用pair记录,不用重写小于。优先队列只记录如下情况的距离:
一,{0,源点}。
二,任意点的最短距离和可以直达的边。
如果是有向图,则入队数量等于边数,计算出起点最短路径的那一轮。无向图,则翻倍。显然出队数量等于入队数量。优先队列入队和出队时间复杂度都是O(logn),故总时间复杂度为O(nlogn)。

样例

 
下表分析源点为0的处理过程。
        

初始

入队{0,0}

出队{0,0}

入队{1,1}

0到源点的最短距离为0

入队{4,2}

出队{1,1}

入队{2,0}

入队{3,2}

1到源点的最短距离为1

入队{5,3}

出队{2,0}

0已经处理

出队{3,2}

入队{7,0}

2到源点最短距离为3

入队{5,1}

入队{6,3}

出队{4,2}

2已经处理

出队{5,1}

1已经处理

出队{5,3}

… 3到源点的最短距离是5。


核心代码


非常的简洁。
typedef pair<long long, int> PAIRLLI;
class  CHeapDis
{
public:
    CHeapDis(int n)
    {
        m_vDis.assign(n, -1);
    }
    void Cal( int start, const vector<vector<pair<int, int>>>& vNeiB)
    {
        std::priority_queue<PAIRLLI, vector<PAIRLLI>, greater<PAIRLLI>> minHeap;
        minHeap.emplace(0, start);
        while (minHeap.size())
        {
            const long long llDist = minHeap.top().first;
            const int iCur = minHeap.top().second;
            minHeap.pop();
            if (-1 != m_vDis[iCur])
            {
                continue;
            }
            m_vDis[iCur] = llDist;
            for (const auto& it : vNeiB[iCur])
            {
                minHeap.emplace(llDist + it.second, it.first);
            }
        }
    }
    vector<long long> m_vDis;
};

测试用例

#include <iostream>
#include <vector>
#include <queue>
#include <assert.h>
using namespace std;

class CDebugDis : public CHeapDis
{
public:
    using CHeapDis::CHeapDis;
    void Assert(const vector<int>& vDis)
    {
        for (int i = 0; i < vDis.size(); i++)
        {
            assert(vDis[i] == m_vDis[i]);
        }
    }
};

struct CDebugParam
{
    int n;
    vector<vector<std::pair<int, int>>> edges;
    int s;
    vector<int> dis;//答案
};

int main()
{
    vector<CDebugParam> params = { {1,{{}},0,{0}},
        {2,{{}},0,{0,-1}},{2,{{{1,2}},{{0,2}}},0,{0,2} }
        ,{3,{{{1,4},{2,5}},{{0,4}},{{0,5}}},0,{0,4,5} }
        ,{3,{{{1,4},{2,8}},{{0,4},{2,3}},{{0,8},{1,3}}},0,{0,4,7} }
        ,{3,{{{1,4},{2,8}},{{0,4},{2,5}},{{0,8},{1,5}}},0,{0,4,8} }
        ,{4,{{{1,1},{2,4}},{{0,1},{2,2},{3,4}},{{0,4},{1,2},{3,3}},{{1,4},{2,3}}},0,{0,1,3,5}}
    };
    for (const auto& par : params)
    {
        CDebugDis n2Dis(par.n);
        n2Dis.Cal(par.s, par.edges);
        n2Dis.Assert(par.dis);
    }
}


测试环境

win7 VS2019 C++17

相关下载

源码及测试用例:

https://download.csdn.net/download/he_zhidan/88390995


doc版文档,排版好
https://download.csdn.net/download/he_zhidan/88348653

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/124043.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传输层协议——TCP、UDP

目录 1、UDP 协议&#xff08;用户数据报协议&#xff09; 协议特点 报文首部格式 2、TCP 协议&#xff08;传输控制协议&#xff09; 协议特点 报文首部格式 TCP连接建立时的三次握手 TCP拆除连接的四次挥手 TCP的流量控制 TCP的拥塞控制 3、传输层端口号 三类端口…

【C++】设计模式之——建造者

建造者模式概念模拟实现建造者模式代码实现 建造者模式 首先先大体了解一下&#xff0c;建造者模式是什么意思&#xff0c;它是怎么实现的&#xff1f; 首先&#xff0c;建造者模式是一种创建型设计模式再一个它是使用多个简单的对象一步一步的搭建出一个复杂的对象它可以将一个…

windows WSL配置cuda,pytorch和jupyter notebook

机器配置 GPU: NVIDIA Quadro K2000 与 NVIDIA 驱动程序捆绑的CUDA版本 但按照维基百科的描述&#xff0c;我的GPU对应的compute capability3.0&#xff0c;允许安装的CUDA最高只支持10.2&#xff0c;如下所示。 为什么本地会显示11.4呢&#xff1f;对此&#xff0c;GPT是这…

objective-c 基础学习

目录 第一节&#xff1a;OC 介绍 ​​第二节&#xff1a;Fundation 框架 ​第三节&#xff1a;NSLog 相对于print 的增强 ​第四节&#xff1a;NSString ​第五节&#xff1a;oc新增数据类型 第六节&#xff1a; 类和对象 ​类的方法的声明与实现 ​第七节&#xff1a;类…

思科:iOS和iOSXe软件存在漏洞

思科警告说,有人试图利用iOS软件和iOSXe软件中的一个安全缺陷,这些缺陷可能会让一个经过认证的远程攻击者在受影响的系统上实现远程代码执行。 中严重程度的脆弱性被追踪为 CVE-2023-20109 ,并以6.6分得分。它会影响启用Gdoi或G-Ikev2协议的软件的所有版本。 国际知名白帽黑客…

【软考】4.2 关系代数

《 关系代数 》 表和表之间的逻辑运算 笛卡尔积&#xff1a;S1 x S2 投影&#xff1a;π&#xff1b;选择某一列&#xff08;属性&#xff09;&#xff1b;一个关系R的投影操作结果也是一个关系&#xff0c;记作Πa&#xff0c;它由从关系R中选出的A列元素构成&#xff1b;选择…

Excel·VBA日期时间转换提取正则表达式函数

标准日期转换 Function 标准日期(ByVal str$) As DateDim pat$, result$arr Array("(\d{4}).*?(\d{1,2}).*?(\d{1,2})", "(\d{4}).*?(\d{1}).*?(\d{1,2})")If Len(str) < 8 Then pat arr(1) Else pat arr(0)With CreateObject("vbscript.r…

怒刷LeetCode的第16天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;迭代 方法二&#xff1a;模拟 方法三&#xff1a;循环模拟 方法四&#xff1a;传递 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯 方法二&#xff1a;枚举优化 第三题 题目来源 题目…

2023年中国电动汽车充换电站行业现状分析:随车配建私人充电桩增量持续上升[图]

充电站指为电动汽车提供充电服务的专用场所&#xff0c;由多台集中布置的充电设备以及相关的供电设备、监控设备﹑配套设施等组成。可将充电站规模分为3类&#xff1a;大型充电站、中型充电站和小型充电站。换电站指为电动汽车提供电池更换服务的场所。按换电模式分类&#xff…

竞赛选题 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

【强化学习】05 —— 基于无模型的强化学习(Prediction)

文章目录 简介蒙特卡洛算法时序差分方法Example1 MC和TD的对比偏差&#xff08;Bias&#xff09;/方差&#xff08;Variance&#xff09;的权衡Example2 Random WalkExample3 AB 反向传播(backup)Monte-Carlo BackupTemporal-Difference BackupDynamic Programming Backup Boot…

CCF CSP认证 历年题目自练Day19

题目一 试题编号&#xff1a; 201812-1 试题名称&#xff1a; 小明上学 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景   小明是汉东省政法大学附属中学的一名学生&#xff0c;他每天都要骑自行车往返于家和学校。为了能尽可能充…