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. Java中0.2减0.1 结果为什么不是0.1?

    double 表示这种类型的数值精度是 float 类型的两倍(有人称之为双精度数值).绝大部 分应用程序都采用double 类型.在很多情况下,float 类型的精度很难满足需求.实际上,只 有很少 ...

  2. 最短小精悍的js数组打乱顺序

          let number = [1, 45, 13, 17];       // 封装一个打乱数组的方法       function getarr(arr) {         return ...

  3. Synology NAS GitLab 配置

    安装 安装的时候会提示服务器名.root用户名等,这步服务器名千万不要写错,不然会登不上去,提示 502. root 密码 网上有很多说 root 密码怎么获取的,但是都不适用. 实际上是第一个访问 ...

  4. 什么?!90%的ThreadLocal都在滥用或错用!

    最近在看一个系统代码时,发现系统里面在使用到了 ThreadLocal,乍一看,好像很高级的样子.我再仔细一看,这个场景并不会存在线程安全问题,完全只是在一个方法中传参使用的啊!(震惊) 难道是我水平 ...

  5. Unix、Linux、GNU 关系梳理

    之前写了一篇 MSYS2.MinGW 和 Cygwin 关系梳理的博客,但是要讲清它们几个的关系最好还是先了解一下操作系统的发展历程.遂补充了这篇博客. UNIX:现代操作系统的始祖 Operatin ...

  6. 使用 nuxi build 命令构建你的 Nuxt 应用程序

    title: 使用 nuxi build 命令构建你的 Nuxt 应用程序 date: 2024/8/30 updated: 2024/8/30 author: cmdragon excerpt: n ...

  7. C语言中的数据类型及其转换

    目录 计算机中的数据类型 整型数据之间的转换 相同字长之间的转换 小字长转大字长 大字长转小字长 int.float.double之间的转换 float->double double->f ...

  8. LoRA大模型微调的利器

    LoRA模型是小型的Stable Diffusion模型,它们对checkpoint模型进行微小的调整.它们的体积通常是检查点模型的10到100分之一.因为体积小,效果好,所以lora模型的使用程度比 ...

  9. redis zset 使用场景

    前文,我们讨论过redis 的数据结构及使用场景.可参考: 参考: 总结篇4:redis 核心数据存储结构及核心业务模型实现应用场景 https://www.cnblogs.com/yizhiamum ...

  10. 合合信息参编“生成式人工智能个人信息保护技术要求系列标准”,助力AI行业可信发展

    生成式人工智能作为新一轮的技术革命成果,在赋能千行百业,给经济社会发展带来新机遇的同时,也产生了个人信息泄露.数据安全风险等问题.在此背景下,中国信息通信研究院(简称"中国信通院" ...