Algorithm 优先队列来处理的 最短路径

最短路径算法(Shortest Paths Algorithm) 假如你有一张地图,地图上给出了每一对相邻城市的距离,从一个地点到另外一个地点,如何找到一条最短的路? 最短路算法要解决的就是这类问题。定义:给定一个有(无)向图,每一条边有一个权值 w,给定一个起始点 S 和终止点 T ,求从 S 出发走到 T 的权值最小路径,即为最短路径。最短路算法依赖一种性质:一条两顶点间的最短路径包含路径上其他最短路径。简单的说就是:最短路径的子路径是最短路径。这个用反证法 阅读详情

看了好久终于看懂了 ,首先你要知道 优先队列在这里的作用是什么。在Djsktra的算法中 我们需要有三个for

其中有个for是要找到 连接中最小的点 并且返回该点 ,这里的优先队列把这个for循环替掉。

/*typedef pair pii;

priority_queue< pii , vector , greater > q; 这个优先队列是根据 pair中的first来 从小到大排的。

这里的pair中的first的值就是dist 所以q.top时 返回了这个最小的点V

<span style="font-size:18px;">#include
#include
#include
#include
using namespace std;
#define MAX 100
const int INF = (1<<30) - 1;
typedef pair pii;

priority_queue< pii , vector , greater > q;   //优先队列

int edges[MAX][MAX];  //邻接表
int n , m;
int d[MAX];  //路径长度

void init()
{
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            if(i == j)
                edges[i][j] = 0;
            else
                edges[i][j] = INF;
        }
    }
}


void dijkstra(int v)
{
    bool done[MAX];
    for(int i = 0; i < n; ++i)
    {
        d[i] = (edges[v][i] == 0 ? 0 : INF);
    }
    memset(done,0,sizeof(done));
    q.push(make_pair(d[v],v));  \\ v:起点
    
    while(!q.empty())
    {
        pii u = q.top();
        q.pop();
        int x = u.second;
        if(done[x]) continue;
        done[x] = true;
        
        for(int j = 0; j < n; ++j)
        {
            if(!done[j] && edges[x][j] < INF && d[x] + edges[x][j] < d[j])
            {
                d[j] = d[x] + edges[x][j];
                q.push( make_pair(d[j],j) );
            }
        }
    }
    
    
    for(int i = 0; i < n; ++i)
    {
        cout << d[i] << endl;
    }
}

int main()
{
    int vi = 0;
    int u , v , w;
    cin >> n >> m;
    init();
    
    for(int i = 0; i < m; ++i)  //无向图的输入
    {
        cin >> u >> v >> w;
        edges[u][v] = edges[v][u] = w;
    }
    
    dijkstra(vi);
    
    return 0;
}</span>


单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm) Dijkstra’s algorithm迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之和为最小的路径. 迪杰斯特拉算法不能处理权值为负数或为零的边,因为本质上它是一种贪心算法,出现了负数意味着它可能会舍弃一条正确的边,而选择一个长边和一个负数边,因为长边和负数边的权值之和可能小于那条正 阅读详情

相关推荐

为什么 BFS 可以搜索到最短路径

估计很多初学者对这个问题一直不明白,为什么使用 BFS 进行广度搜索,一定可以搜索到最短路径。 讲真,在学校里学习 BFS 的时候,自己也没完全明白为什么。老师这么教,课本这么写,我就这么记。 其实回答这个问题很简单,请大家仔细观察下图,也就是使用 BFS 完成对树的搜索。比如,我要搜索节点 A 到节点 G 的最短路径。如下动图所示: 在 BFS 中,我们使用了数据结构中的一个队列(queue),我们知道队列的特性是 FIFO(First In First Out),也就是先进先出。正是这个 FIFO 特性,保证了我们第一个到达目标节点一定是最短路径。下面解释一下整个 BFS 的过程,我们整

最短路径(优化版)dijkstra+优先队列

P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。链接:https://ac.nowcoder.com/acm/contest/26077/1007。接下来m行,每行3个数a,b,v描述一条无向道路a——b,长度为v。如果有解,输出一行,表示满足条件的最短公交线路的长度c。第一行有4个正整数n,m,s,t。

2401_88153596的博客 360

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

三种求最短路算法基本描述及实现(C++)

1.Floryed 2.Dijkstra 3.SPFA

qq_59700927的博客 2854

OpenManus本地部署实战:从源码编译到浏览器路径优化全解析

本文详细解析了OpenManus本地部署的全过程,从源码编译到浏览器路径优化。涵盖环境准备、源码获取、模型配置、依赖安装等关键步骤,特别针对Windows系统下的chrome.exe路径修改提供了实用解决方案,帮助开发者高效完成部署并优化性能。

weixin_28826545的博客 379

智能车竞赛新手必看:用AD21从零画一块英飞凌TC264核心板(附开源PCB文件)

本文详细介绍了使用Altium Designer 21(AD21)从零开始设计英飞凌TC264核心板的完整流程,涵盖原理图绘制、PCB布线到最终DRC检查的全过程。针对智能车竞赛新手,提供了实用的硬件设计技巧和开源PCB文件,帮助快速掌握TC264核心板开发。

weixin_27017211的博客 246

最短路径dijkstra算法及其优先队列的优化

最短路径问题:对任意给出的图G(V,E)和起点S,终点T,如何求从S到T的最短路径。解决最短路径问题的算法有Dijkstra算法,Bellman-Ford算法,SPFA算法和Floyd算法。 Dijkstra算法描述 主要用于解决单源最短路径问题,即给定图G(V,E)和起点s,通过算法得到S到达其他每个顶点的最短距离。 算法步骤:设置集合S存放已被访问的顶点,然后执行n次下面的每个步骤(n为...

qq_40123329的博客 3060

Vue2项目实战:vue2-org-tree实现动态组织架构图

本文详细介绍了如何在Vue2项目中使用vue2-org-tree组件实现动态、可交互的组织架构图。内容涵盖从快速安装、基础渲染到核心功能实战,包括水平布局、节点展开折叠、响应式数据绑定、深度自定义节点内容以及事件处理。同时提供了性能优化、样式覆盖等避坑指南,并通过一个完整的企业级Demo展示了如何打造功能丰富的架构图,助力高效开发后台管理系统。

weixin_28040125的博客 522

优先队列——最短路径

/* 7 10 1 2 2 1 3 5 2 3 4 3 4 2 2 4 6 4 6 1 2 5 10 5 6 3 5 7 5 6 7 9 0 2 5 7 12 8 17 */ #include<iostream> #include<vector> #include<queue> using namespace std; const int MAX_V=10...

huantingyizhan的博客 1049

MIKE水动力笔记5_建立水动力模型

前文已经讲了如何制作网格文件(.mdf文件),这一博文就讲如何建立水动力模型。

晏长街的博客 3万+

13、控制依赖与切片的新基础及递归While程序的摘要

本文探讨了控制依赖和程序切片的新研究进展,并提出了一种用于递归While程序的广义过程摘要概念和验证框架。文章介绍了控制依赖的新定义及其优势,程序切片的相关工作,以及递归While程序的过程摘要在完全正确性和终止性证明中的应用。通过阶乘和插入排序程序的示例分析,展示了过程摘要的有效性。未来的研究将聚焦于并发程序的依赖计算、依赖关系的语义连接以及时间属性的保留。

kotlin6android的博客 85

Java数据结构 之 PriorityQueue(优先队列)

当谈到数据结构时,很多人可能首先会想到列表(数组)、栈、队列等常见的数据结构。然而,在某些情况下,我们需要一种更高效的方式来处理数据,特别是在涉及到任务调度、事件处理、路径搜索等问题时。这就是优先队列(PriorityQueue)的用武之地。本文将简要介绍优先队列的概念,它的应用领域,以及通过示例演示如何使用它来解决实际问题。

吾家有猫名探花的博客 1万+

IEEE S&P 2026 大模型安全论文整理

本文梳理了 IEEE S&P 2026(第47届 IEEE 安全与隐私研讨会)中与 LLM Safety 相关的论文,涵盖大模型越狱攻击、防御与对齐、隐私保护、RAG 安全、多模态大模型安全、智能体安全、图-LLM 安全、工具链安全及生成式 AI 安全与隐私等方向。

CSPhD-winston的博客 1333

最短路径 vijos P1406古韵之鹊桥相会

要注意出队!!! #include #include #include using namespace std; int n,m; int dx[4]={0,1,0,-1}; int dy[4]={1,0,-1,0}; int f[30][30],b[30][30],a[30][30]; int q[400001][3]; void spfa(int x,int y) {

白&夜的博客 591

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

POJ2449 (k短路)

#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; #define maxn 2008 #define maxm 2000008 #...

aekijekzn484879763的博客 191

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

poj 2449 Remmarguts' Date 求第k短路 Astar算法

=.=好菜 #include <iostream> #include <cstdio> #include <string.h> #include <cstring> #include <queue> using namespace std; const int N = 1e3+10; const int M = 1...

weixin_30731287的博客 69

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HDU6767 费用流+建图

//#define LOCAL #include <bits/stdc++.h> using namespace std; #define ll long long #define mem(a, b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define DNF 0x7f #define DBG printf("this is a input\n") #define fi first #define se second #define mk(.

Zenith_Habitant的博客 405

蓝桥杯模板总结:

堆优化的单源最短路: #include<iostream> #include<cstdio> #include<queue> #include<vector> using namespace std; int read(){ int x,f; x=0;f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-'){ f=-1; } ch=getchar(); }

qq_40480598的博客 1210

spfa

单源最短路 dis数组存距离 其步骤和迪杰斯特拉我觉得差不多 落谷例题 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779。 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。 输入格式 第一行包含三个整数 n,m,sn,m,s,分别表示点的个数、有向边的个数、出发点的编号。 接下来 mm 行每行包含三个整数 u,v,wu,v,w,表示一条 u \to vu→v 的,长度为 ww 的边。 输出格式 输出一行 nn 个整数,第 ii 个表示

qq_52172364的博客 153

k短路算法(A*)

1 /** 2 * poj 3 * Problem#2449 4 * Accepted 5 * Time: 250ms 6 * Memory: 9252k 7 */ 8 #include <iostream> 9 #include <fstream> 10 #include <sstream&gt...

weixin_30347335的博客 148

挑战408——数据结构(29)——最短路径算法(Dijkstra's Algorithm)

在图中,给每一条路径带上一定的权重,这样的图我们称为带权图。如下图所示: 带权图 我们现在来回顾一下BFS跟DFS的基本思想: 深度优先搜索:继续沿着路径搜索,直到我们需要回溯,但这种方式不保证最短路径。 广度优先搜索:查看包含距离1的邻居,然后是距离2的邻居等的路径,直到找到路径,这种方式保证最短路径。 但这两种方法都是无法处理带权图的问题。举个例子 由A到D的最短路径是什么?我...

redAnt的博客 1575

数据结构——图(7)——最短路径与Dijkstra's Algorithm

虽然

redAnt的博客 799

ok-wuthering-waves 任务 API 详解:BaseTask 与 TriggerTask 生命周期、执行器语义与配置模型

本篇以 ok-script 框架的 Task API 参考文档为核心,结合 ok-wuthering-waves(鸣潮自动化)仓库中的真实任务实现,系统讲解 `BaseTask`/`TriggerTask` 两类任务类的生命周期钩子、执行器对一次性任务与触发任务的调度语义、配置模型与 GUI 控件推导机制,以及任务注册、无头运行和中英文双语开发的完整实践。读完本文,你可以基于该 API 规范为游戏

gitblog_00456的博客 504

DAGS & Dijkstra‘s algorithm

如果我们按某个从“源头到尾部”的顺序处理每个点(拓扑序),那么每次 relax 入边的时候,所有前置点的最短路径值已经确定好了!而 Bellman-Ford 不知道正确顺序,所以要对所有边反复 relax,直到稳定为止(最多 V-1 轮)。负权边可能会让后面发现更短的路径,Dijkstra 以为之前是最短的就“封锁”了,不再更新,导致结果错误。负权边可能会让后面发现更短的路径,Dijkstra 以为之前是最短的就“封锁”了,不再更新,导致结果错误。你刚才理解的是正确的。你刚才理解的是正确的。

m0_74331272的博客 868

优先队列优化 dijkstra

#include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long const int N = 30005; const LL INF = 1LL << 60; s

生活总是要微笑着面对~ 1174
上一篇: Algorithm 最短路径算法ford
下一篇: Algorithm 最短路径之 SPFA
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值