单源最短路 Dijkstra 算法 C++高效实现

C++语言(单源最短路) 只有一丢~的代码(附加一些不知道对不对的口胡) 至于图吗,,,,,我想后期我会补上~只是我想~~~~ 先贴上 #include<iostream> #include<cstdio> #include<string.h> #define Tnf 2147483647 /* fist[一个点x]=边 表示x这个点连接的第一条边是谁 next[一条边mm]=边kk 表示mm这条边连接的下一条边的名字叫kk to[一条边xx]=一个点y1 表示xx这条边连向的点是y1 阅读详情
#include  < iostream >
#include 
< vector >
#include 
<set>
using   namespace  std;

typedef vector 
< int >  vi;
typedef pair 
< int ,  int >  ii;
typedef vector 
< ii >  vii;
typedef vector 
< vii >  vvii;
const   int  INF  =   0x7FFFFFFF ;

//  创建一个赋权邻接表(参考样例,具体问题可能需要适当修改,特别是对于无向图)
//  n 为顶点数(从 0 开始标记),e 为边数
vvii AVLmaker ( int  n,  int  e)
{
    vvii G (n);
    
for  ( int  i  =   0 ; i  <  e; i  ++ )
        {
        
int  v1, v2, d;
        cin 
>>  v1  >>  v2  >>  d;
        G [v1].push_back (ii (v2, d));
        }
    
return  G;
}

//  s 为源点,返回 s 到各点的最短路长度,INF 表示无法到达
vi Dijkstra ( const  vvii &  G,  int  s)     //  vvii G is the adjacent vertices list of the weighted directed graph
{    
    
int  n  =  G.size ();
    vi D (n, INF);
    
set   < ii >  Q;
    D [s] 
=   0 ;
    Q.insert (ii (
0 , s));
    
while  ( ! Q.empty ())
        {
        ii p 
=   * Q.begin ();
        Q.erase (Q.begin ());
        
int  d  =  p.first, v  =  p.second;
        
for  ( int  i  =   0 , j  =  G [v].size (); i  <  j; i  ++ )
            {
            
int  v2  =  G [v] [i].first, d  =  G [v] [i].second;
            
if  (D [v2]  >  D [v]  +  d)     // notice that D [v] != INF && d != INF
                {
                
if  (D [v2]  !=  INF)
                    {
                    Q.erase (Q.find (ii (D [v2], v2)));
                    }
                D [v2] 
=  D [v]  +  d;
                Q.insert (ii (D [v2], v2));
                }
            }
        }
    
return  D;
}
 
参考来源:
TopCoder tutorials : Power up C++ with the Standard Template Library : Part II: Advanced Uses : Dijkstra by set

PS:
这个是图论里最基本的问题,今天终于搞定了,为往日浪费的光阴忏悔。。Orz。。
这个实现的确很高效,在 Sicily 的某题的提交结果:
Run ID      User Name      Problem      Language      Status      Run Time      Run Memory      Submit Time
92839       rappizit     1387     C++     Accepted     0 sec     252 KB     2007-10-31 20:20:12

===============================================================================
2007-11-28 Update:
implemented via priority_queue, faster but use more memory, and add a statement : if (v ==t) break;
#include  < vector >
#include 
< queue >
#include 
< functional >
using   namespace  std;

typedef vector 
< int >  vi;
typedef pair 
< int ,  int >  ii;
typedef vector 
< ii >  vii;
typedef vector 
< vii >  vvii;

int  Dijkstra ( const  vvii &  G,  int  s,  int  t)
{
    
const   int  INF  =   0x7FFFFFFF ;
    
int  n  =  G.size ();
    vi D (n, INF);
    priority_queue 
<  ii, vector  < ii > , greater  < ii >   >  Q;
    D [s] 
=   0 ;
    Q.push (ii (
0 , s));
    
while  (Q.size ())
        {
        ii p 
=  Q.top ();
        Q.pop ();
        
int  d  =  p.first, v  =  p.second;
        
if  (v  ==  t)  break ;
        
if  (D [v]  <  d)  continue ;
        
for  ( int  i  =   0 , j  =  G [v].size (); i  <  j; i  ++ )
            {
            
int  v2  =  G [v] [i].first, d  =  G [v] [i].second;
            
if  (D [v2]  >  D [v]  +  d)     //  D [v] != INF && d != INF
                {
                D [v2] 
=  D [v]  +  d;
                Q.push (ii (D [v2], v2));
                }
            }
        }
    
return  (D [t]  ==  INF  ?   - 1  : D [t]);
}
C++单源点最短路——dijkstra的堆优化模板(包看包懂) 众所周知,最短路是图论问题里最重要的问题,本文将详细探索最短路算法的dijkstra算法的堆优化。初学者必看的博客。 阅读详情

相关推荐

Dijkstra与最短路算法:竞赛与应用全解析

最短路算法是图论中的核心问题,用于在带权图中寻找顶点间的最短路径。Dijkstra算法基于贪心策略,通过逐步扩展已知最短路径的顶点集合来求解单源最短路,其堆优化版本时间复杂度为O(mlogn),适合处理稀疏图。Bellman-Ford和SPFA算法能处理含负权边的图,而Floyd算法则以O(n³)的时间复杂度解决全源最短路问题。这些算法在编程竞赛和工程实践中都有广泛应用,如交通规划、网络路由等场景。掌握不同算法的适用场景和优化技巧,对于解决实际问题至关重要。

weixin_30512089的博客 438

超详细单源最短路详解(part1. Dijkstra)

给出一张个结点,m条边的图G(有向图或无向图),第i条边代价为a[i],求给定结点s到所有节点的最短距离比如说在这张图中,假如将dis[i]记录为S点到点Vi的最短路距离,则dis数组应当为现在我们理解了什么叫做,那么用什么算法解决呢?不能有负权(想处理负权请期待下期spfa)...

zzxcpi的博客 593

C++实现单源最短路算法

1、单源最短路算法         n个处理器,第一个处理器要广播消息到其他所有的处理器,求需要时间最短是多少(从第一个点出发,求到其他点最短路的最大值) 2、思路        这个基本上没啥可说。看代码理解就是。 3、代码实现        #include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cmath&gt;...

程序猿老樊的博客 1175

基于邻接矩阵的朴素Dijkstra单源最短路C++极简实现

基于邻接矩阵的Dijkstra实现 使用C++,可以方便的写出一个通用的朴素dijkstra极简实现,核心逻辑不超过20行。 #include <vector> #include <algorithm> #include <cstdio> using namespace std; vector<int> dijkstra(vector<vector<int>> &graph, int start) { const i

Life runs on code 654

前端埋点的实践

1、前言 开始正文前先介绍一下埋点的概念~,(熟悉的朋友可以略过) 前端埋点: 是一种手段,它的目的是上报相关行为数据,相关人员以数据为依据来分析产品在用户端的使用情况,根据分析出来的结果辅助产品优化、迭代。 BI:商业智能,公司内部做数据分析相关的部门。 2、背景 在流量红利逐渐消失的现在,数据的采集、分析和精细化的运营显得更加重要,所以埋点的需求在互联网产品中是很常见的,目的上面也提到了。我们的追求就是又快又好的做好埋点工作,但是现实却不那么美好;目前我们团队在前端埋点方面存在一些痛点: 在构造埋点字段

Arui_0的博客 1772

产生式系统的完整示例——医疗诊断系统(附python代码)

发烧(Fever)、咳嗽(Cough)、皮疹(Rash)、喉咙痛(SoreThroat)、头痛(Headache)、流涕(RunnyNose)、呼吸困难(ShortnessOfBreath)、白细胞计数高(HighWBC)、接触流感患者(ContactFlu)、接触麻疹患者(ContactMeasles)。(2)若规则库中存在尚未使用过的规则,而且它的前提(前件)可与综合数据库中的已知事实匹配,则转第(3)步;(3)执行当前选中的规则,并对该规则做上标记,把该规则执行后得到的结论送入综合数据库中。

搏博的专栏 1704

算法-最短路问题

1e9 && dist[b] > back_up[a] + w) //要注意备份数组的使用。//注意堆插入的时机。//这里不用used数组,需要判断的是是否当前在queue中。//需要单独处理自环距离。最短路问题分为①②单源正权值最短路③④单源存在负权值的最短路⑤多源最短路。if (curr == n) //可以提前结束。

Brooklyn_nets的博客 195

Ubuntu 上 1Panel 的安装与高效运维实践

本文详细介绍了在Ubuntu系统上安装和高效运维1Panel面板的完整实践指南。内容涵盖了一键安装、Docker容器可视化部署、计划任务自动化以及网站数据库管理等核心功能,并提供了安全加固、资源监控与数据备份等进阶技巧,旨在帮助用户快速搭建并管理一个强大易用的服务器环境。

weixin_29210759的博客 144

C++图论基础单源最短路-常规版dijkstra算法/堆优化版dijkstra算法/bellman-ford 算法/spfa 算法流食般投喂

spfa算法其实就是用队列优化的Bellman-Ford算法,因为我们知道,Bellman-Ford算法中,在执行单次操作时,并不是所有边都进行了有效的松弛操作,只有经松弛操作之后的节点的出边才可能会继续有松弛操作,所以,我们用了队列来优化,队列里面存着经过松弛操作后待处理节点,从队列里面拿出来时,这个节点在呆在队列的过程中,别的节点进行松弛操作,连带着他已经经过一次或者多次,已经充分进行了松弛操作,所以,出队列时,我们拿到的就是最新最好的结果,这样我们也不要有。bool st[N]。

江屿风的博客 9543

【74HC595芯片】核心驱动代码

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

weixin_67147824的博客 1848

VOF模型求解方法:从SIMPLEC到PISO的稳定性优化策略

本文深入探讨了VOF模型求解方法中SIMPLEC与PISO算法的稳定性优化策略,重点分析了两种算法在稳态和瞬态问题中的应用差异。通过对比PRESTO离散化方法与其他格式的优劣,提供了针对多相流模拟的实用设置建议和稳定性优化技巧,帮助工程师有效提升计算效率和精度。

yellow的专栏 1154

单源最短路

介绍了单源最短路问题的两种主要算法:Dijkstra和SPFA。Dijkstra适用于非负权图,采用贪心策略,时间复杂度为O((V+E)logV);SPFA允许负权边,基于动态逼近,平均时间复杂度为O(E)。文章还简要说明了差分约束系统与最短路问题的联系,并提供了两种算法的C++实现代码和对应洛谷模板题。最后给出了算法选择建议,强调Dijkstra的效率优势和SPFA的负权处理能力,同时提醒注意负权环检测等常见陷阱。

蒟蒻分享算法学习日常 1373

游戏数据训练世界模型:AI物理规律学习与仿真应用实践

世界模型作为理解现实世界动态的AI工具,通过多模态数据学习物理和空间属性来预测未来状态。其核心原理在于从环境交互中提取物理规律,技术价值体现在能够安全、低成本地训练AI系统应对复杂场景。在应用层面,游戏数据因其结构化环境和内置物理引擎,成为世界模型训练的优质素材。游戏世界中的物体交互、运动轨迹等数据天然包含现实物理规律,特别适合训练物理AI。本文以General Intuition公司获得3.2亿美元融资为切入点,深入探讨游戏数据在世界模型训练中的技术实现路径,涵盖数据提取管道构建、多模态数据融合方法,以及

weixin_29056865的博客 367

单源最短路算法——Dijkstra

Dijkstra算法是单源最短路算法,可以求解不带负权边的图中,从源点s到其它所有点的最短路。 时间复杂度近似O(n^2),可以用堆优化。 一般用邻接表,也可用邻接矩阵。在稠密图上会有较好的性能表现。 在这里插入代码片 ...

gyp0205的博客 328

从 Material Requirements Planning 看 SAP 物料计划的底层控制逻辑

文章摘要:SAP中的MRP(物料需求计划)不仅仅是运行一个程序(如MD01N),其关键在于主数据和组织层级的正确配置。MRP的核心是解决"何时需要多少物料"的问题,涉及采购、生产、库存等多种供应来源。物料主数据的MRP视图必须在组织层级(如工厂、存储位置)下维护,不同层级的计划逻辑可能完全不同。S/4HANA更强调MRP Area作为细分计划单位,取代传统存储位置MRP。实施时需注意MRP Profile的合理使用,避免批量错误,并特别关注物料生命周期管理(如停用物料和替代件),这些因素共同决定了MRP能否

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1415

基于 Qt C++ 的战术通信终端

logMessage(QString("新客户端连接来自: %1:%2").arg(incomingTcpSocket->peerAddress().toString()).arg(incomingTcpSocket->peerPort()));logMessage(QString("服务器已启动,在 [%1]:%2 监听IPv6连接...").arg(ui->lineEditAddress->text()).arg(port));

寒寒豆豆软件公司的博客 78

最短路之Dijkstra+堆优化(单源最短路)

优先队列实现对Dijkstra的优化 求单源最短路 #include<bits/stdc++.h> #define INF 0x3f3f3f3f #define mod 1000000007 #define IOS ios::sync_with_stdio(false) #define endl '\n' using namespace std; typedef long long ...

zzqwtc的博客 1791

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Dijkstra求最短路 I

本文介绍了Dijkstra算法求解单源最短路径问题。该算法适用于边权为正的稠密图,采用贪心策略:从起点开始,逐步扩展未访问点,每次选择当前距离最小的点并更新其邻居的距离。文章详细解析了算法思想、邻接矩阵存储方式、时间复杂度分析(O(n²)),并提供了完整的C++实现代码,包括初始化、距离更新和不可达处理。通过城市配送的生动示例,直观展示了算法执行过程,最后指出该算法在网络路由、机器人规划等领域的广泛应用价值。

Xiaochen_12的博客 823

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构——图及其C++实现 最小生成路径Dijkstra算法

在前两篇文章中,我们已经了解到了图的基本要素,和最小生成树的概念。接下来我们就要学习图的一个非常重要的概念——最短路径。考虑你站在错综复杂的交通网中心(图论中的顶点),每条道路都有通行时间(边的权值如何找到:1️⃣ 从A到B的最快路线?单源最短路径2️⃣ 所有地点之间的最短通行方案?全源最短路径3️⃣ 当某些道路限行(负权边)时,如何规避陷阱?

学习日记 1334

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Dijkstra求最短路 II

本文详细介绍了堆优化Dijkstra算法在求解稀疏图最短路径问题中的应用。针对包含150,000个节点和边的物流网络问题,文章对比了传统算法与堆优化版本的关键差异,重点阐述了邻接表存储结构和优先队列的动态更新策略。通过代码实现解析,展示了如何使用C++实现该算法,包括数据结构设计、邻接表构建和核心算法流程。复杂度分析表明,堆优化将时间复杂度从O(n²)降至O((n+m)logn),极大提升了处理大规模稀疏图的效率。文章最后提出了关于负权边和进一步学习方向的思考题,鼓励读者实践应用该算法解决实际问题。

Xiaochen_12的博客 1218

单源最短路——dijkstra算法

首先我们应该考虑的是如何将这个图中的每条有向边表示出来 刚开始大家肯定都会想到用二维数组,用坐标来写两个点间的距离,但这会造成时间和空间的巨大浪费,因此,我们就需要新型高效的方法来储存这些有向边—— 1.链式前向星 struct edge { int next; int to; int val; }a[maxn]; int head[maxn];//head[i]为i...

Mmasker的博客 414

C++之最短路径算法(Dijkstra)

前面我们讲过权值为1时的最短路径的算法,也就是无权最短路径算法。但是如果时赋权图呢?我们该怎么办呢? 解决单源(只有一个开始顶点)最短路径的算法为Dijkstra,而该算法的核心思想是贪婪算法。贪婪算法的思想简单来讲就是“目光短浅,眼前利益为主”,也就是分阶段求解问题,在每个阶段去寻找最优解。Dijkstra算法也是按阶段进行,在每个阶段选择离开始顶点最近的顶点(未访问),我们对每一个顶点(v...

风吟 2921

[Dijkstra] 单源最短路 P3371

  题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 输入输出格式 输入格式:       第一行包含三个整数N、M、S,分别表示点的个数、有向边的个数、出发点的编号。 接下来M行每行包含三个整数Fi、Gi、Wi,分别表示第i条有向边的出发点、目标点和长度。   输出格式:       一行,包含N个用空格分隔的整数,其中第i个整数表示从点S...

博客 265

【单源最短路 图论】882,网络安全最新大厂面试真题总结

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步优快云学院,听白银讲师(也就是鄙人)的讲解。细分点:枚举各边的两个端点,如果端点能到达,且距离为dis,则通过此端点能够到达 maxMoves - dis 个细分点。费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!,大家跟着这个大的方向学习准没问题。

2401_83946261的博客 1152

(图论)Dijkstra(单源无负权边最短路)

Dijkstra(最短路问题) 现在咱们要在一个图上求每个节点与1号节点的最短路,那么古人就发明出来了一个Dijkstra算法,就是每次都用当前距离1号节点距离最小的那个点来刷新到1号节点的距离,每次都把这个点划分到答案集合里面去,然后当把所有点都划分到答案集合里面去的时候答案就出来了,那么下面来个简单的证明吧 看一下这个图,现在的起点是1,那么按照算法的话下一次就应该更新与1相连的点,那就是2和6,现在dis[2] > dis[6] 所以下一次就用6来更新,把6加到答案集合里面,那么为什么这个di

weixin_51979465的博客 182

图解最短路径算法:Dijkstra到Floyd

算法适用问题处理负权重时间复杂度优点缺点Dijkstra单源最短路径否$O((V单源最短路径是$O(V\cdot所有节点对是(无负环)$O(V^3)$如果图权重非负且规模大,优先用 Dijkstra。如果存在负权重或需检测负环,用 Bellman-Ford。如果需所有节点对最短路径且节点数少,用 Floyd-Warshall。通过以上讲解和代码示例,希望您能更深入地理解这些算法。动手实践代码,加深记忆!如果有具体问题,欢迎进一步讨论。

2502_93949526的博客 321
上一篇: JAVA BigInteger 类用例 1:求一个大整数的平方根的整数部分 (SGU 111)
下一篇: 无向图的欧拉回路线性时间算法
Rappy
博客等级 码龄20年 48粉丝 42原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值