当前位置: 首页 > news >正文

无负环全源最短路

无负环全源最短路最直接的算法是 floyd,复杂度 \(O(V^3)\)

还有一种 Johnson 算法。复杂度为 \(O(VElogV)\),在图非常稀疏的时候有用。

Johnson先对边权进行调整,使得所有边的边权都为正,这样就可以跑 dijkstra 了。
一个朴素的做法是所有边都加上一个值,但是这样经过的边越多,权值越大,显然不合适。
Johnson 的思想是在走到一个点的时候扣除一个权值,在走出一个点的时候加上一个权值,这样无论经过多少个点,中间结点经历一进一出、权值一减一增会全部抵消。最终实际权值只需要用起点和终点进行调整。

关键是如何合理设计权值,使得调整后的边权全部为正。
如果有一条边 \(e_{u \rightarrow v}\) 的权值为负,我们需要将其调到至少为零,即调增 \(|w_{uv}|\)
如果从 \(u \rightarrow v\) 负权的边有多条,那么调增量至少为绝对值最大那个。单纯考虑这两个点确实就是可行的了。但是如果考虑整体,可能有另外一条中转道路使得 \(u \rightarrow v\) 的权值还是很低。所以这个其实启发我们求出所有点对之间的最短路,以这个最短路的结果作为依据来调整。
Johnson 的做法是设置一个辅助起点,向每个点连一个边权为 \(0\) 的边,先做一遍 spfa,求出各个点到这个辅助起点的距离。
此时只需根据求得的距离对边权进行调整:
设原边权为 \(w_{uv}\),调整后的边权为 \(w_{uv}+h_u-h_v\)
这样一定是把所有边的权重都修正为非负的。
简单证明,对于一条边 \(e_{u \rightarrow v}\),在原图中,最短路跑完后一定有 \(h_v \le h_u+w_{uv}\),移项后 \(w_{uv}+h_u-h_v \ge 0\)

在新图中求完最短路后,\(dis_{uv}'=dis_{uv}+h_u-h_v\)
只需要按起点和终点的权重进行调整即可。
无负边权的最短路可以用 dijkstra 计算,每个顶点作为起点跑一次,每次复杂度 \(O(ElogV)\), 复杂度 \(O(VElogV)\)

    deque<int> q;for (int i = 1; i <= n; i++) q.push_back(i), in[i] = true;fill(in + 1, in + n + 1, true);while (!q.empty()) {int now = q.front();q.pop_front(), in[now] = false;for (auto [nxt, len] : g[now])if (dis[nxt] > dis[now] + len) {dis[nxt] = dis[now] + len;cnt[nxt] = cnt[now] + 1;if (cnt[nxt] >= n) {cout << "-1\n";return;}if (!in[nxt]) {in[nxt] = true;if (q.empty() || dis[nxt] < dis[q.front()])q.push_front(nxt);elseq.push_back(nxt);}}}for (int i = 1; i <= n; i++)for (auto [nxt, len] : g[i]) gg[i].emplace_back(nxt, len + dis[i] - dis[nxt]);priority_queue<pii, vector<pii>, greater<>> pq;for (int i = 1; i <= n; i++) {pq.emplace(0, i), fill(dis2, dis2 + n + 1, inf);while (!pq.empty()) {auto [len, now] = pq.top();pq.pop();if (dis2[now] != inf) continue;dis2[now] = len;for (auto [nxt, len2] : gg[now]) pq.emplace(len + len2, nxt);}ll ans = 0;for (ll j = 1; j <= n; j++) {if (dis2[j] == inf)ans += j * inf;elseans += j * (dis2[j] - dis[i] + dis[j]);}cout << ans << '\n';}
http://www.gsyq.cn/news/1481613.html

相关文章:

  • 2026 苏州吴中区漏水维修攻略|苏易修缮推荐:卫生间/阳台/外墙/屋顶/地下室漏水|靠谱防水门店推荐 - 苏易修缮
  • 微信数据守护者:WechatBakTool带你轻松备份珍贵聊天记录
  • 上海专业的入境就医服务公司哪家好
  • 3分钟搞定Windows软件:免费开源Whisky的macOS终极指南[特殊字符]
  • 2026年陕西高考复读学校横评:提分幅度、升学成果与教学管理全对比 - 科技焦点
  • 数据结构进阶(五):最短路径——Dijkstra 与 Floyd 算法
  • 终极OBS背景移除插件:3分钟打造专业虚拟绿幕效果
  • Sunshine游戏串流完整指南:打造您的个人游戏云服务器
  • 上海家庭聚餐东北菜餐厅:从需求到落地的实测指南 - 奔跑123
  • CSDN AI数字营销企业版报价怎么获取?5大隐藏通道、4类资质门槛与2024最新阶梯定价表曝光
  • 5分钟精通:让模糊媒体焕然一新的AI超分辨率工具
  • 使用数显千分表矫正泵箱进程
  • 告别窗口尺寸困扰:WindowResizer完全使用指南
  • 技术深度解析:Mem Reduct内存优化原理与实战应用
  • 如何5分钟彻底解决Windows软件运行问题:Visual C++运行库终极修复指南
  • 2026年国产氨氮水质在线自动监测仪十大品牌全景深度解析:技术突围与场景化选型指南 - 水质仪表品牌排行榜
  • 想冲北航人工智能?先看看这份985/211生源数据与避坑指南
  • 用 AI Coding 做项目时,我踩过的坑
  • VNC远程桌面文件传输终极方案:除了RealVNC,你还有这些开源/免费工具可选
  • 终极指南:如何用EdB Prepare Carefully打造完美RimWorld开局
  • 2026年权威排名 最新烟台正规技工学校、高技能人才培训学校排行:办学实力与口碑实测对比 - 奔跑123
  • 从凸透镜到相机:用初中物理公式1/u+1/v=1/f,彻底搞懂OpenCV相机标定的成像原理
  • 163MusicLyrics:免费开源歌词提取工具,轻松获取网易云和QQ音乐歌词
  • 2026重庆持证导游TOP10测评|第一梯队服务、口碑与体验差异解析 - 随峰国旅
  • 构建企业级权限控制:mini-rbac架构解析与实践指南
  • 2026西安本地导游怎么联系?正规渠道+靠谱联系方式+避坑全指南 - 旅行分享
  • 镜像视界空间实景精准复刻技术,构建法庭庭审可视化视频孪生系统
  • 基于plc的喷泉控制系统设计(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • CSDN AI数字营销效果追踪全指南(附可复用的7日归因分析模板)
  • PPTC自恢复保险丝:从原理到实战选型与PCB布局避坑指南