单源最短路径(SSSP问题)

news/2025/10/24 12:06:01/文章来源:https://www.cnblogs.com/xihegudi/p/19162913

单源最短路径(SSSP问题)

(正权稀疏图)动态数组存图+Djikstra算法

使用优先队列优化,以 \(\mathcal O(M\log N)\) 的复杂度计算。

vector<int> dis(n + 1, 1E18);
auto djikstra = [&](int s = 1) -> void {using PII = pair<int, int>;priority_queue<PII, vector<PII>, greater<PII>> q;q.emplace(0, s);dis[s] = 0;vector<int> vis(n + 1);while (!q.empty()) {int x = q.top().second;q.pop();if (vis[x]) continue;vis[x] = 1;for (auto [y, w] : ver[x]) {if (dis[y] > dis[x] + w) {dis[y] = dis[x] + w;q.emplace(dis[y], y);}}}
};

(负权图)Bellman ford 算法

使用结构体存边(该算法无需存图),以 \(\mathcal{O} (NM)\) 的复杂度计算,注意,当所求点的路径上存在负环时,所求点的答案无法得到,但是会比 INF 小(因为负环之后到所求点之间的边权会将 d[end] 的值更新),该性质可以用于判断路径上是否存在负环:在 \(N-1\) 轮后仍无法得到答案(一般与 \({\tt INF} / 2\) 进行比较)的点,到达其的路径上存在负环。

下方代码例题:求解从 \(1\)\(n\) 号节点的、最多经过 \(k\) 条边的最短距离。

const int N = 550, M = 1e5 + 7;
int n, m, k;
struct node { int x, y, w; } ver[M];
int d[N], backup[N];void bf() {memset(d, 0x3f, sizeof d); d[1] = 0;for (int i = 1; i <= k; ++ i) {memcpy(backup, d, sizeof d);for (int j = 1; j <= m; ++ j) {int x = ver[j].x, y = ver[j].y, w = ver[j].w;d[y] = min(d[y], backup[x] + w);}}
}
int main() {cin >> n >> m >> k;for (int i = 1; i <= m; ++ i) {int x, y, w; cin >> x >> y >> w;ver[i] = {x, y, w};}bf();for (int i = 1; i <= n; ++ i) {if (d[i] > INF / 2) cout << "N" << endl;else cout << d[n] << endl;}
}

(负权图)SPFA 算法

\(\mathcal{O}(KM)\) 的复杂度计算,其中 \(K\) 虽然为常数,但是可以通过特殊的构造退化成接近 \(N\) ,需要注意被卡。

const int N = 1e5 + 7, M = 1e6 + 7;
int n, m;
int ver[M], ne[M], h[N], edge[M], tot;
int d[N], v[N];void add(int x, int y, int w) {ver[++ tot] = y, ne[tot] = h[x], h[x] = tot;edge[tot] = w;
}
void spfa() {ms(d, 0x3f); d[1] = 0;queue<int> q; q.push(1);v[1] = 1;while(!q.empty()) {int x = q.front(); q.pop(); v[x] = 0;for (int i = h[x]; i; i = ne[i]) {int y = ver[i];if(d[y] > d[x] + edge[i]) {d[y] = d[x] + edge[i];if(v[y] == 0) q.push(y), v[y] = 1;}}}
}
int main() {cin >> n >> m;for (int i = 1; i <= m; ++ i) {int x, y, w; cin >> x >> y >> w;add(x, y, w);}spfa();for (int i = 1; i <= n; ++ i) {if (d[i] == INF) cout << "N" << endl;else cout << d[n] << endl;}
}

(正权稠密图)邻接矩阵存图+Djikstra算法

很少使用,以 \(\mathcal{O} (N^2)\) 的复杂度计算。

const int N = 3010;
int n, m, a[N][N];
int d[N], v[N];void dji() {ms(d, 0x3f); d[1] = 0;for (int i = 1; i <= n; ++ i) {int x = 0;for (int j = 1; j <= n; ++ j) {if(v[j]) continue;if(x == 0 || d[x] > d[j]) x = j;}v[x] = 1;for (int j = 1; j <= n; ++ j) d[j] = min(d[j], d[x] + a[x][j]);}
}
int main() {cin >> n >> m;ms(a, 0x3f);for (int i = 1; i <= m; ++ i) {int x, y, w; cin >> x >> y >> w;a[x][y] = min(a[x][y], w); //注意需要考虑重边问题a[y][x] = min(a[y][x], w); //无向图建双向边}dji();for (int i = 1; i <= n; ++ i) {if (d[i] == INF) cout << "N" << endl;else cout << d[n] << endl;}
}

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

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

相关文章

CNCF项目记录2025-10

毕业项目持续集成与交付:argo、flux 安全与规范:cert-manager、Falco、in-toto、Open Policy Agent、tuf 云原生网络:cilium 流式消息:cloudevents 容器运行时:containerd、cri-o 服务发现:CoreDNS、etcd 云原生…

代理

代理是一种设计模式StarService.java package com.itheima.demo4proxy; // 明星行为接口 public interface StarService {void sing(String name);String dance(); }Star.java package com.itheima.demo4proxy;import …

双碳目标下,MyEMS 为何成为制造企业的 “刚需工具”?

在 “碳达峰、碳中和” 目标全面推进的背景下,制造业作为能源消耗和碳排放的核心领域,正面临前所未有的减排压力与转型挑战。据统计,我国制造业能耗占全国总能耗的 60% 以上,碳排放占比超 50%—— 这意味着,制造业…

树上路径交

树上路径交 计算两条路径的交点数量,直接载入任意 LCA 封装即可。 int intersection(int x, int y, int X, int Y) {vector<int> t = {lca(x, X), lca(x, Y), lca(y, X), lca(y, Y)};sort(t.begin(), t.end());…

10.23总结

include include using namespace std; class DoubleStack { private: int* arr; // 共享的数组int top1; // 栈1的栈顶指针int top2; // 栈2的栈顶指针int size; // 数组的总大小public: /…

关于 vue项目 代理的坑;baseURL必须为空;代理才会生效

/*** 创建 HTTP 请求实例*/ const request = axios.create({baseURL: baseConfig.SERVER_BASE_URL, // 当使用vite代理的时候基础IP设置为空;当axios 配置了baseURL之后;会导致请求直接跳过vite代理timeout: 60000…

点分治 / 树的重心

点分治 / 树的重心 重心的定义:删除树上的某一个点,会得到若干棵子树;删除某点后,得到的最大子树最小,这个点称为重心。我们假设某个点是重心,记录此时最大子树的最小值,遍历完所有点后取最大值即可。重心的性质…

10.21总结

include include using namespace std; struct Student{ int id; string name; int score; }; int main(){ Student student[100]; int n=0; while(cin>>student[n].id>>student[n].name>>student[n…

最近公共祖先 LCA

最近公共祖先 LCA 树链剖分解法 预处理时间复杂度 \(\mathcal O(N)\) ;单次查询 \(\mathcal O(\log N)\) ,常数较小。 struct HLD {int n, idx;vector<vector<int>> ver;vector<int> siz, dep;vec…

题解:P3343 [ZJOI2015] 地震后的幻想乡

题意:给出一个图,无重边自环,边权为 \([0,1]\) 内的随机数,问最小生成树最大边权的期望。 做法: 注意到题目中有一个 hint:\(m\) 个随机变量的 \(k\) 小值期望是 \(\frac{k}{m+1}\),考虑怎么使用。 考虑暴力,因…

暂存:P14214 [COI 2010] 圆圈 / KOLO

\(\mathcal {P14214\ \ [COI 2010]\ \ 圆圈 \ \ /\ \ KOLO}\) #include<bits/stdc++.h> using namespace std;const int N=5e6+10; int pre[N],nxt[N]; int n,k,a; vector<int>p; const int M=1e7;//5e5…

树论大封装(直径+重心+中心)

树论大封装(直径+重心+中心) struct Tree {int n;vector<vector<pair<int, int>>> e;vector<int> dep, parent, maxdep, d1, d2, s1, s2, up;Tree(int n) {this->n = n;e.resize(n + 1);…

QMPlayer2解析

编译好我们就可以解析QMPlayer2,直接debug运行代码。 首先先看一下懒汉单例模式的QMPlay2GUIClass,宏定义了一个QMPlay2GUI #define QMPlay2GUI \QMPlay2GUIClass::instance()单例模式 QMPlay2GUIClass &qmplay2G…

2025年10月广州单位办公室搬家公司全景解析报告,基于专业测评的技术、性能及市场优势深度分析

在现代化城市运营体系中,单位办公室搬迁是一项涉及空间规划、设备保护、数据安全及效率管理的系统性工程。据2025年最新行业调研数据显示,广州企事业单位搬迁市场需求量年均增长12%,其中超80% 的单位将"专业资…

书评-谋杀黄昏

看了这么多小说,很少有像这本一样,让我流泪的,让我迫切地想要写写自己的感触的。 林思弦和陈寄原本互相厌恶,却阴差阳错,在平淡的相处中互生好感。但林思弦自知先前行径有多恶劣,又因陈寄对其他和他性格截然不同…

徐州信息技术服务管理体系认证渠道口碑榜:聚焦机构资质、服务案例及合规性评估

随着企业数字化转型加速,信息技术服务管理体系认证(ISO/IEC 20000-1)已成为衡量服务机构核心竞争力的关键指标。据行业统计,2024年徐州地区认证需求同比增长23.7%,企业对认证机构的资质完备性、本地化服务能力及合…

完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用

完整教程:【汽车篇】AI深度学习在汽车零部件外观检测——铝铸件中的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

附加数据文件失败:操作系统错误 5:“5(拒绝访问。)”。 CREATE DATABASE 失败。无法创建列出的某些文件名

错误: 无法打开物理文件“D:\MSSQLDATA\K3DBConfiger2022814305192_Data.mdf”。操作系统错误 5:“5(拒绝访问。)”。CREATE DATABASE 失败。无法创建列出的某些文件名。请查看相关错误。 (Microsoft SQL Server,错误…

20251024- 使用shell脚本分库定时备份MySQL数据

#!/bin/bash# 注意mysql和mysqldump命令使用绝对路径# mkdir -p /data/backup_mysql # touch /data/backup_mysql/backup_mysql.loghost="127.0.0.1" port="3306" user="root" password…

权威调研榜单:东莞工厂装修公司OP3榜单好评深度解析

2025年东莞工厂装修公司权威推荐榜:聚焦专业资质、施工规模及服务案例的深度解析 工厂装修作为工业建筑领域的重要组成部分,其专业性直接关系到生产环境的安全性与运营效率。随着制造业升级需求的不断提升,装修公司…