算法系列 | 图论最短路径算法
目录引入一、经典单源最短路径1.普通BFS代码2.Dijkstra迪杰斯特拉算法代码3.Bellman-Ford代码4.SPFA代码二、多源全源最短路径1.Floyd-Warshall代码2.Johnson代码总结例题基础提高引入这是一张无向图接下来尝试给边上加上一些箭头你就得到了一张有向图在拓展一点给每条边赋予边权你就得到了一张有向带权图我们可以假设边权就是距离那么我们就得到了一张地图。接下来抛出一个问题我们该如何求任意两点或某个确定点与其他点的最短路径呢这时就要用到单/多源最短路径算法也就是本文的主题。最短路径算法有许多通常会根据不同的场景来选择不同的最短路径算法。一、经典单源最短路径单源最短路径指的是求某一个确定的点到其他所有点的最短距离。1.普通BFS常用于无权图所有边权重相等核心思想是逐层向外扩展首次访问即最短路径。代码int dist[MAXN]; int q[MAXN]; // 数组模拟队列 void bfs(int n, int src) { memset(dist, -1, sizeof(dist)); int front 0, rear 0; dist[src] 0; q[rear] src; while (front rear) { int u q[front]; for (int i head[u]; i ! -1; i nxt[i]) { int v to[i]; if (dist[v] -1) { dist[v] dist[u] 1; q[rear] v; } } } }2.Dijkstra迪杰斯特拉算法常用于非负权图是一种贪心算法每次选取离起点最近且未处理的节点进行松弛。通常会使用优先队列优化适合稀疏图。代码#include queue using PII pairint, int; int dist[MAXN]; bool vis[MAXN]; void dijkstra(int n, int src) { memset(dist, 0x3f, sizeof(dist)); memset(vis, false, sizeof(vis)); priority_queuePII, vectorPII, greaterPII pq; dist[src] 0; pq.push({0, src}); while (!pq.empty()) { auto [d, u] pq.top(); pq.pop(); if (vis[u]) continue; vis[u] true; for (int i head[u]; i ! -1; i nxt[i]) { int v to[i], w weight[i]; if (!vis[v] dist[v] dist[u] w) { dist[v] dist[u] w; pq.push({dist[v], v}); } } } }3.Bellman-Ford更适用于非负权稠密图核心思路是对每条边进行轮松弛操作。较少使用。代码struct Edge { int u, v, w; } edges[MAXM]; int dist[MAXN]; bool bellman_ford(int n, int m, int src) { memset(dist, 0x3f, sizeof(dist)); dist[src] 0; // 松弛 n-1 次 for (int i 1; i n - 1; i) { bool updated false; for (int j 1; j m; j) { int u edges[j].u, v edges[j].v, w edges[j].w; if (dist[u] ! INF dist[v] dist[u] w) { dist[v] dist[u] w; updated true; } } if (!updated) break; } // 检测负环 for (int j 1; j m; j) { int u edges[j].u, v edges[j].v, w edges[j].w; if (dist[u] ! INF dist[v] dist[u] w) { return false; // 存在负环 } } return true; }4.SPFA在所有最短路径算法中最“全面发展”的一个但在部分特殊情况不如某些其他算法。核心思路是用队列维护发生松弛的节点减少无效松弛。稀疏图极快但很有可能被出题者卡数据导致退化为。代码int dist[MAXN]; bool inQueue[MAXN]; int q[MAXN]; // 队列 int cnt[MAXN]; // 入队次数检测负环 bool spfa(int n, int src) { memset(dist, 0x3f, sizeof(dist)); memset(inQueue, false, sizeof(inQueue)); memset(cnt, 0, sizeof(cnt)); int front 0, rear 0; dist[src] 0; q[rear] src; inQueue[src] true; while (front rear) { int u q[front]; inQueue[u] false; for (int i head[u]; i ! -1; i nxt[i]) { int v to[i], w weight[i]; if (dist[v] dist[u] w) { dist[v] dist[u] w; if (!inQueue[v]) { q[rear] v; inQueue[v] true; cnt[v]; if (cnt[v] n) return false; // 存在负环 } } } } return true; }二、多源全源最短路径1.Floyd-Warshall通常用邻接矩阵实现更适合稠密图只是时间复杂度有些高核心思想为动态规划枚举中间点尝试松弛的路径。代码int g[MAXN][MAXN]; // 邻接矩阵 void floyd(int n) { // 初始化g[i][i]0, 有边g[i][j]w, 无边g[i][j]INF for (int k 1; k n; k) { for (int i 1; i n; i) { if (g[i][k] INF) continue; // 小优化 for (int j 1; j n; j) { if (g[i][j] g[i][k] g[k][j]) { g[i][j] g[i][k] g[k][j]; } } } } }2.Johnson适合稀疏图核心思想为先通过重新赋予非负权重势能法再对每个点跑。代码int h[MAXN]; // 势能 int dist_johnson[MAXN][MAXN]; // 结果矩阵 bool johnson(int n, int m) { // Step 1: 添加超级源点0到所有点边权为0 for (int i 1; i n; i) { addEdge(0, i, 0); } // Step 2: SPFA/Bellman-Ford 计算势能h[] if (!spfa(n 1, 0)) { return false; // 存在负环 } for (int i 1; i n; i) { h[i] dist[i]; } // Step 3: 移除超级源点重新建图 // 实际使用中重新初始化head重新添加原边这里省略 // 新权重 w w h[u] - h[v] (非负) // Step 4: 对每个点跑Dijkstra for (int src 1; src n; src) { // 使用上面的dijkstra函数使用重新赋权后的图 // 结果 dist_johnson[src][v] dist[v] h[v] - h[src] } return true; }总结首先是对各类最短路径算法的详细汇总算法名称时间复杂度适用场景核心思想能否处理负权图密度适用性BFS广度优先搜索O(V E)无权图所有边权重相等逐层向外扩展首次访问即最短路径。不涉及权重稀疏/稠密均可E较小更优Dijkstra优先队列优化O((VE) log V)非负权图最常用贪心策略每次选取离起点最近且未处理的节点进行松弛。不能负权会失效稀疏图更优ElogVBellman-FordO(VE)含负权边的图对每条边进行 V-1 轮松弛操作。能可检测负环稀疏图尚可稠密图极慢SPFA队列优化Bellman-Ford平均 O(E)最坏 O(VE)含负权边且需快速或判断负环用队列维护发生松弛的节点减少无效松弛。能可检测负环稀疏图极快稠密图易退化Floyd-WarshallO(V³)稠密图或需输出所有点对距离动态规划枚举中间点 k尝试松弛 i→j 的路径。能但不能有负环稠密图最优V³与E无关JohnsonO(VE V² log V)稀疏图且含负权边先通过 Bellman-Ford 重新赋予非负权重势能法再对每个点跑 Dijkstra。能但不能有负环稀疏图更优当 E V²/logV 时其次是对算法选择的决策过程1. 无权图 → BFS单源 / 多源BFS全源 2. 非负权图 ├─ 单源 │ ├─ 稀疏图E V²/logV→ Dijkstra优先队列O(ElogV) │ └─ 稠密图E ≈ V² → Dijkstra朴素O(V²) └─ 全源 ├─ 稀疏图 → 对每个点跑Dijkstra堆O(VElogV) └─ 稠密图 → Floyd-Warshall O(V³) 3. 含负权边无负环 ├─ 单源 │ ├─ 稀疏图 → SPFA平均O(E) │ └─ 稠密图 → Bellman-Ford O(VE) 或 SPFA但都会很慢 └─ 全源 ├─ 稀疏图 → Johnson O(VE V²logV) └─ 稠密图 → Floyd-Warshall O(V³)虽慢但实现简单 4. 需要检测负环 ├─ 单源 → Bellman-Ford 或 SPFA └─ 全源 → Floyd-Warshall检测 g[i][i] 0接下来是对于图的密度的判断标准图类型判断标准说明稀疏图E V log V邻接表存储优先队列Dijkstra中等图V E V² / logV两种Dijkstra都可以稠密图E ≈ V²邻接矩阵存储朴素Dijkstra或Floyd完全图E V(V-1)/2必然用朴素Dijkstra或Floyd例题基础洛谷 P2910 [USACO08OPEN] Clear And Present Danger Shttps://www.luogu.com.cn/problem/P2910洛谷 P3371 【模板】单源最短路径弱化版https://www.luogu.com.cn/problem/P3371提高P1144 最短路计数https://www.luogu.com.cn/problem/P1144P2446 [SDOI2010] 大陆争霸https://www.luogu.com.cn/problem/P2446感谢观看有问题欢迎提出

相关新闻

维修工程师的示波器实战:06 差分探头——真正进入高频世界的大门

维修工程师的示波器实战:06 差分探头——真正进入高频世界的大门

第六篇:差分探头——真正进入高频世界的大门 ——当你终于停止测量“地”,才开始真正测量信号 凌晨两点。 伺服驱动器再次发出刺耳的故障报警。 过压保护频繁触发。 母线电压正常。 电源正常。 控制逻辑正常。 所有参数看起来都“没问题”。 年轻工程师接上普通探头,屏息…

2026/8/4 3:34:18 阅读更多 →
Unity GLB模型导入插件选择与性能优化全攻略

Unity GLB模型导入插件选择与性能优化全攻略

1. 项目概述:为什么GLB模型导入值得你花时间研究?在Unity项目里,尤其是涉及到AR/VR、数字孪生或者高精度可视化展示时,导入外部3D模型是家常便饭。几年前,FBX格式几乎是唯一的选择,但最近几年,G…

2026/8/4 3:33:18 阅读更多 →
2026年正规SEO公司怎么选:七大避坑维度+真实案例复盘+KPI对赌合同指南|解析

2026年正规SEO公司怎么选:七大避坑维度+真实案例复盘+KPI对赌合同指南|解析

核心要点:从投入产出关系看,2026年SEO服务市场良莠不齐,企业筛选正规SEO公司,应围绕资质审查、白帽技术验证、内容质量检查、数据透明度、合同条款、KPI对赌机制以及售后退出安排七个维度展开系统评估。从结果验证看,本…

2026/8/4 3:33:18 阅读更多 →

最新新闻

WorkBuddy技能开发实战:从自然语言到智能工作流自动化

WorkBuddy技能开发实战:从自然语言到智能工作流自动化

1. 从“一句话”到“外挂”:WorkBuddy技能的本质与价值最近在折腾WorkBuddy,一个能让你用自然语言创建自动化工作流的工具。很多人可能听说过它,但总觉得“技能”(Skill)这个概念有点玄乎,不就是写个脚本吗…

2026/8/4 6:02:25 阅读更多 →
Unity项目WebView集成实战:从选型到性能优化的完整指南

Unity项目WebView集成实战:从选型到性能优化的完整指南

1. 项目概述:为什么Unity项目需要WebView?如果你正在开发一个Unity应用,无论是游戏、工具还是企业级应用,大概率会遇到一个需求:在应用内部展示一个网页。这个需求可能来自产品经理的一句“我们这里需要嵌入一个活动页…

2026/8/4 6:02:25 阅读更多 →
App与H5交互:JSBridge双向通信原理、安全优化与Vue实践

App与H5交互:JSBridge双向通信原理、安全优化与Vue实践

1. 项目概述:App与内嵌H5的交互桥梁在移动应用开发领域,混合开发模式因其高效和灵活性,已经成为许多团队的首选方案。一个典型的场景是,在原生App(无论是iOS还是Android)的某个页面或模块中,嵌入…

2026/8/4 6:02:25 阅读更多 →
冒泡社区《幻想三国》还能玩吗?安卓手机与电脑模拟器试玩记录

冒泡社区《幻想三国》还能玩吗?安卓手机与电脑模拟器试玩记录

前些日子看到有人提起冒泡社区,我不禁又想起了《幻想三国》。 当年的手机屏幕不大,网速也谈不上快,但每天上线做任务、养副将、逛医馆,偶尔再去赤壁和几个小游戏里转一圈,反而比现在不少手游更容易让人记住。 最近我…

2026/8/4 6:02:25 阅读更多 →
别让你的网站“裸奔”:大白话讲透HTTPS与SSL证书

别让你的网站“裸奔”:大白话讲透HTTPS与SSL证书

‌兄弟们,咱们搞技术的,或者自己搭过网站的,肯定都听过“HTTPS”和“SSL证书”这俩词。很多人觉得,不就是网址前面多了个“s”嘛,有啥大不了的?今天咱就用大白话聊聊,为啥你的网站必须赶紧上SSL…

2026/8/4 6:02:25 阅读更多 →
LeetCode全排列问题:回溯算法详解与多语言实现

LeetCode全排列问题:回溯算法详解与多语言实现

1. 问题背景与核心挑战LeetCode第46题"Permutations"是算法学习中的经典排列问题,要求给定一个不含重复数字的数组,返回所有可能的全排列。这道题在亚马逊、微软等大厂面试中出现频率极高,也是理解回溯算法的入门必修案例。我最初接…

2026/8/4 6:01:24 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →