Johnson全源最短路:负权化正权,最后减去势能差

(1)建虚点0,add(0,i,0),跑st=0的单源最短路hi

(2)e[i].w+=h[u]-h[v]

​ Q:为何这样不会得到错误答案?

​ A:[ 最短路 - OI Wiki ]()

(3)O(N^2*logN)跑n次dijk

Code:(关键是要能熟练写出dijk和spfa)

#include<bits/stdc++.h>
#define F(i,l,r) for(int i=l;i<=r;++i)
#define G(i,r,l) for(int i=r;i>=l;--i)
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
priority_queue<pair<int,int> >pq;
const int N=3e3+5;
const int inf=1e9;
struct node{
int v,ne,w;
}e[N<<2];
int n,m,k=0,cnt[N],first[N];
bool vis[N];
ll sum=0,h[N],dis[N][N];
inline void add(int x,int y,int z){ e[++k].v=y; e[k].w=z; e[k].ne=first[x]; first[x]=k; }
inline bool spfa(){
mem(vis); queue<int> q; q.push(0); vis[0]=1; h[0]=0; cnt[0]=1;
F(i,1,n) h[i]=inf;
while(q.size()){
int u=q.front(); q.pop(); vis[u]=0;//出队
for(int i=first[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(h[v]>h[u]+w){
h[v]=h[u]+w;
cnt[v]=cnt[u]+1;
if(cnt[v]>=n+2) return 1;
if(!vis[v]) q.push(v),vis[v]=1;
}
}
}
return 0;
}
inline void dijk(int st){
mem(vis); pq.push(make_pair(0,st));
while(!pq.empty()){
int u=pq.top().second; pq.pop();
if(vis[u]) continue; vis[u]=1;//u已访问过
for(int i=first[u];i;i=e[i].ne){
int v=e[i].v,w=e[i].w;
if(dis[st][v]>dis[st][u]+w){
dis[st][v]=dis[st][u]+w;
if(!vis[v]) pq.push(make_pair(-dis[st][v],v));
}
}
}
}
int main(){
scanf("%d%d",&n,&m); F(i,1,n) add(0,i,0);
int u,v,w; F(i,1,m){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
if(spfa()) { puts("-1"); return 0;}
F(i,1,n) F(j,1,n) i!=j?dis[i][j]=inf:dis[i][j]=0;
F(u,1,n) for(int i=first[u];i;i=e[i].ne) e[i].w+=h[u]-h[e[i].v];
F(i,1,n){
dijk(i); sum=0;
F(j,1,n) sum+=dis[i][j]==inf ? 1ll*j*inf : 1ll*j*(dis[i][j]-h[i]+h[j]);//对于dis[i][j]=inf,不需要处理势能差
printf("%lld\n",sum);
}
return 0;
}

Johnson全源最短路:负权化正权,最后减去势能差的更多相关文章

  1. Johnson全源最短路

    例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...

  2. Johnson 全源最短路

    学这个是为了支持在带负权值的图上跑 Dijkstra. 为了这个我们要考虑把负的权值搞正. 那么先把我们先人已经得到的结论摆出来.我们考虑先用 SPFA 对着一个满足三角形不等式的图跑一次最短路,具体 ...

  3. 【学习笔记】 Johnson 全源最短路

    前置扯淡 一年多前学的最短路,当时就会了几个名词的拼写,啥也没想过 几个月之前,听说了"全源最短路"这个东西,当时也没说学一下,现在补一下(感觉实在是没啥用) 介绍 由于\(spf ...

  4. Johnson 全源最短路径算法学习笔记

    Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...

  5. Johnson 全源最短路径算法

    解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...

  6. 模板C++ 03图论算法 2最短路之全源最短路(Floyd)

    3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...

  7. Johnson算法:多源最短路算法

    Johnson算法 请不要轻易点击标题 一个可以在有负边的图上使用的多源最短路算法 时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\) 空间复杂度\(O(n+m ...

  8. Floyd-Warshall 全源最短路径算法

    Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...

  9. 【算法】单源最短路——Dijkstra

    对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...

  10. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

随机推荐

  1. MPTCP(五):MPTCP路径管理工具iproute2/ip-mptcp编译及安装

    简介 ip-mptcp是一个MPTCP路径管理工具,它可以决定哪些链路允许作为MPTCP子流存在 仅对MPTCPv1有效 在支持MPTCPv1的内核中使用man ip-mptcp可以查看相关帮助 gi ...

  2. Linux驱动| Linux内核 RTC时间架构

    上一篇文章我们给大家讲解了基于瑞芯微rk3568平台芯片hym8563驱动的移植,本文给大家详细讲解Linux内核的时间子系统. <Linux驱动|rtc-hym8563移植笔记> 一.L ...

  3. 电子行业MES系统流程图梳理

  4. Webpack 核心流程

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:霜序 三个阶段 初始化阶段 初始化参数:从配置文件.配置对 ...

  5. 浅谈Integer缓存机制原理

    面试题引入 这里引申出一个经典问题,看下面代码 Integer a = 100; Integer b = 100; System.out.println(a == b);//true Integer ...

  6. Oracle数据库自动备份

    1.bat脚本 格式为ANSI格式 set CURDATE=%date:~0,4%%date:~5,2%%date:~8,2% set CURMON=%date:~0,4%%date:~5,2% se ...

  7. 拼多多API出租,拼多多API租用,拼多多订单信息获取API,拼多多开放平台权限出租,拼多多开放平台API出租

    当前,拼多多开放平台的审核还是比较严格的,虽然可以申请,但是难度很大,对于一些用户来说困难还是蛮大的 拼多多的API主要拼多多订单信息获取.拼多多商品上传,拼多多库存更新等 需要这块API的一般是需要 ...

  8. Playwright 源码 BrowserType

    playwright-java 的 Browser.BrowserContext.Page 挺好理解的,唯独这厮,就有一丢丢 -- package com.microsoft.playwright; ...

  9. Facebook – Facebook Page Embed

    前言 在网站嵌套 Facebook 专页是很好的推广方式哦. 虽然网站还是需要做 Blog, 但是通常被订阅的都是 Facebook 专页而不是网站 Blog. 开通账号 它的 setup 很简单, ...

  10. Autodesk Maya无法打开 refrence file 解决办法

    删除预设 预设的位置在: 我的文档/maya/version/ prefs 备注: 我的文档/maya/version/ 无法确定是不是该路径下的所有文件夹都能删除,所以只剪切了 prefs 文件夹出 ...