题解:P4779 【模板】单源最短路径(标准版)

题目传送门

算法分析

本题要求计算单源最短路径,并且边权非负,适合使用Dijkstra 算法。Dijkstra 算法是一种贪心算法,用于计算带权有向图或无向图中单个源节点到所有其他节点的最短路径。

为什么选择 Dijkstra 算法?

  1. Dijkstra 算法要求所有边权非负。在本题中,题目明确说明边权 \(0 ≤ wi ≤ 10^9\),完全符合 Dijkstra 的应用条件。若存在负权边,Dijkstra 可能会得到错误结果,此时需使用 Bellman-Ford 或 SPFA 算法。

  2. 朴素实现:\(O (n²)\),适用于节点数较少的稠密图
    优先队列优化:\(O ((m+n) logn)\),其中m为边数,n为节点数。本题数据范围为\(1 ≤ n ≤ 10^5\)\(1 ≤ m ≤ 2×10^5\),使用优先队列优化后的 Dijkstra 可以高效处理。

  3. Dijkstra 算法是确定性算法,对于相同的输入,结果唯一且可预测。相比之下,某些近似算法或启发式算法(如 A*)可能需要额外信息(如启发函数),而 Dijkstra 仅依赖图的结构和边权。

  4. 本题要求计算从起点s到所有其他节点的最短路径,Dijkstra 算法正是为此场景设计。若仅需计算特定终点的最短路径,可在找到终点后提前终止算法。

本题为何不选择其他算法?

Floyd-Warshall 算法:时间复杂度 \(O (n³)\),适用于多源最短路径,但本题仅需求单源路径,使用该算法会导致超时。
Bellman-Ford/SPFA 算法:适用于含负权边的图,时间复杂度较高\((O (mn))\),在本题的非负权图中效率低于 Dijkstra。

注意事项

由于边权非负,Dijkstra 算法可以正确处理本题。
使用优先队列时,由于 C++ 的优先队列默认是最大堆,因此存储距离的负值来模拟最小堆。
初始化距离数组时,使用 \(2147483647\) 表示无穷大,避免溢出。

算法思路

  1. 初始化所有节点的距离为无穷大,起点的距离为\(0\)
  2. 使用优先队列(最小堆)来维护待处理的节点,优先处理距离最小的节点。
  3. 每次从优先队列中取出距离最小的节点,遍历其所有邻接边,更新邻接节点的距离。
  4. 重复步骤3,直到优先队列为空。

代码实现

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<ext/pb_ds/priority_queue.hpp>
#define MP(x, y) make_pair(x, y)
#define Pair pair<int, int> 
using namespace std;
const int MAXN = 1e6 + 10, INF = 2147483646, B = 19;// 快速读入函数
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = 1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}int N, M, S;// 边的结构体
struct Edge {int u, v, w, nxt;
};
Edge E[MAXN];
int head[MAXN], num = 1;// 添加边
void AddEdge(int x, int y, int z) {E[num] = (Edge) {x, y, z, head[x]};head[x] = num++;
}int dis[MAXN], vis[MAXN];
priority_queue<Pair> q; // Dijkstra算法实现
void Dij() {// 初始化距离数组for(int i = 1; i <= N; i++) dis[i] = 2147483647;dis[S] = 0; q.push(MP(0, S));while(!q.empty()) {int p = q.top().second; q.pop();if(vis[p]) continue; vis[p] = 1;// 遍历当前节点的所有邻接边for(int i = head[p]; i != -1; i = E[i].nxt) {int to = E[i].v;// 松弛操作if(dis[to] > dis[p] + E[i].w) dis[to] = dis[p] + E[i].w,q.push(MP(-dis[to], to));}}// 输出结果for(int i = 1; i <= N; i++)printf("%d ", dis[i]);
}int main() {// 初始化头数组memset(head, -1, sizeof(head));// 读入数据N = read(); M = read(); S = read();for(int i = 1; i <= M; i++) {int x = read(), y = read(), z = read();AddEdge(x, y, z);}// 执行Dijkstra算法Dij();return 0;
}

代码解释

· 快速读入函数:由于输入数据量较大,使用快速读入函数可以提高效率。

· 邻接表存储图:使用结构体数组和头数组来存储图的邻接表,便于遍历每个节点的所有邻接边。

· Dijkstra 算法:使用优先队列优化的 Dijkstra 算法,每次取出距离最小的节点进行处理,并更新其邻接节点的距离。

· 松弛操作:对于每个邻接节点,如果通过当前节点到达该节点的距离更短,则更新该节点的距离。

复杂度分析

时间复杂度:\(O ((m + n) logn)\),其中 n 是节点数,m 是边数。

空间复杂度:\(O (m + n)\),主要用于存储图的邻接表和优先队列。

审核大大求过

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

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

相关文章

网关配置

sy //进入配置undo in en //关闭信息中心 in en //打开信息中心int g0/0/0 //进入接口 ip add xxx.xxx yyy.yyy//配置该接口的ip及子网掩码原本左右2个不是同网段的设备 无法联通 通过网关配置后 网关作为中间人联…

湖南服装网站建设创意做美食视频网站

文章目录 代码实现参考 代码实现 本文实现 ResNet原论文 Deep Residual Learning for Image Recognition 中的50层&#xff0c;101层和152层残差连接。 代码中使用基础残差块这个概念&#xff0c;这里的基础残差块指的是上图中红色矩形圈出的内容&#xff1a;从上到下分别使用…

北京微网站建设公司广州专业做继承案件律师

11月3日-5日&#xff0c;由中国开源软件推进联盟 PostgreSQL 分会主办的中国 PostgreSQL 数据库生态大会在北京中科院软件所隆重举行。大会以”极速进化融合新生”为主题&#xff0c;从线下会场和线上直播两种方式展开&#xff0c;邀请了数十位院士、教授、高管和社群专家&…

高频感应钎焊在制冷行业的应用与优势:高效、绿色、智能的焊接革命!

在追求“双碳”目标与智能制造的时代浪潮下,制冷行业正经历一场静悄悄的技术革命。其中,高频感应钎焊(High-Frequency Induction Brazing)作为一项先进连接工艺,正以其高效、安全、精准的特性,全面取代传统火焰钎…

题解:P12672 「LAOI-8」近期我们注意到有网站混淆视听

题目传送门 题目分析 本题要求我们判断对于给定的字符串,最少需要多少次字符交换操作,使得字符串中不存在同时包含 LGR 子串和 CSP 子串的情况。每次操作可以交换任意两个字符。 关键观察: 若字符串中不同时存在 LG…

详细介绍:基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战

详细介绍:基于LangChain构建高效RAG问答系统:向量检索与LLM集成实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &q…

网站改版 优势php+mysql网站开发

需求&#xff1a;给定两个整数&#xff0c;被除数和除数(都是正数&#xff0c;且不超过int的范围)。 将两数相除&#xff0c;要求不使用乘法、除法和%运算符。 得到商和余数。 被除数 %除数商 ... 余数 #这里%代表除 //1、求商&#xff0c;就是求里…

网站模板后台手机免播看成片

docker迁移容器 将容器保存为镜像 docker commit container-id image-name将保存好的镜像打包(保存到/path文件夹) docker save image-name > /path/image-name.tar将打包好的镜像迁移到新服务器&#xff0c;新服务器执行如下命令 scp -P 22 username旧服务器IP地址:/旧服务…

完整教程:docker创建postgreSql带多个init的sql

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

vscode的文心快码插件不错

vscode的文心快码插件不错vscode的文心快码插件不错

做网络营销如何建立自己的网站昆明建网站要多少钱

事件委托&#xff08;事件代理&#xff09; 将原本需要绑定在子元素上的事件监听器委托在父元素上&#xff0c;让父元素充当事件监听的职务。 事件委托是一种利用事件冒泡的特性&#xff0c;在父节点上响应事件&#xff0c;而不是在子节点上响应事件的技术。它能够改善性能&a…

EPU+VPU+WBUC+WAUC:AI元人文的硅基基石体系

EPU+VPU+WBUC+WAUC:AI元人文的硅基基石体系 这四大组件共同构成了一个完整的、支持价值感知、博弈、创造与分布式协同的硬件基础。它们之间的关系,并非简单的并列,而是一个有机的、分层协同的体系。 一、 核心组件定…

地下城做心悦任务的网站wordpress后台cookies

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 qrencode 是一个用于生成二维码的命令行工具。它可以将文本、URL、电话号码等信息转换为二维码图像。生成的二维码图像可以保存为图片文件&#xff0c;方便在电子文档、网页、移动应用等各种场景中使用。 它支持的二维…

自己有一个域名怎么做网站个人工作室装修风格

题目&#xff1a;77. 组合 参考链接&#xff1a;代码随想录 回溯法理论基础 回溯三部曲&#xff1a;回溯函数模板返回值以及参数、回溯函数终止条件、回溯搜索的遍历过程。 模板框架&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&…

响水做网站需要多少钱企业网站建设规划ppt

开发条件&#xff1a;eclipsepydev插件django editor插件 关于eclipse安装小编就不多做介绍&#xff0c;我自己用的版本如下 1.安装pydev插件 启动Eclipse, 点击Help->Install New Software 弹出如下框 点击add 分别在 Name中填:Pydev, Location中填http://pydev.org/up…

加强网站微信公众号平台建设wordpress添加网易云音乐播放器

一、文件的属性 1. 权限详解 r 表示读权限————————————读取文件内容 w 表示写权限————————————编辑、新增、修改内容(非删除) x 代表执行权限———————————读取文件内容 — 表示没有该权限——————————读取文件内容 2. 权限对目录的重…

Educational Codeforces Round 183 (Rated for Div. 2)题解

Educational Codeforces Round 183 (Rated for Div. 2)题解Educational Codeforces Round 183 (Rated for Div. 2) 题解 A 直接提前分给三人,看看余下多少,然后用 3 去相减就行了。不过注意 3 的倍数的情况是 0。 #i…

html做的网页怎么变成网站wordpress充值金币

在OSI模型中&#xff0c;会话层&#xff08;Session Layer&#xff09;主要负责建立、管理和终止会话&#xff0c;提供数据交换的服务。然而&#xff0c;相对于物理层、数据链路层、网络层、运输层等层&#xff0c;会话层的协议并没有像其他层次那样具有明确的、广泛应用的协议…

济南住房和城乡建设局网站seo网站导航建设技巧

目录 一、前言 二、为什么会出现构造函数和析构函数 三、构造函数 &#x1f34e;构造函数的概念 &#x1f350;构造函数特性 &#x1f4a6;解释特性3&#xff1a;对象实例化时编译器自动调用对应的构造函数 &#x1f4a6;解释特性4&#xff1a;构造函数支持重载 &…

股市技术分析突破

本书通过简洁生动的文字和图文并茂的形式介绍了股市分析的各种理论、技巧和心法。 全书分为4篇共10章。技术篇(第1~5章)重点介绍股票估值和财务报表分析的实用方法,以及技术分析的各种理论及技巧,包括常见的K线组合…