Johnson全源最短路:负权化正权,最后减去势能差
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全源最短路:负权化正权,最后减去势能差的更多相关文章
- Johnson全源最短路
例题:P5905 [模板]Johnson 全源最短路 首先考虑求全源最短路的几种方法: Floyd:时间复杂度\(O(n^3)\),可以处理负权边,但不能处理负环,而且速度很慢. Bellman-Fo ...
- Johnson 全源最短路
学这个是为了支持在带负权值的图上跑 Dijkstra. 为了这个我们要考虑把负的权值搞正. 那么先把我们先人已经得到的结论摆出来.我们考虑先用 SPFA 对着一个满足三角形不等式的图跑一次最短路,具体 ...
- 【学习笔记】 Johnson 全源最短路
前置扯淡 一年多前学的最短路,当时就会了几个名词的拼写,啥也没想过 几个月之前,听说了"全源最短路"这个东西,当时也没说学一下,现在补一下(感觉实在是没啥用) 介绍 由于\(spf ...
- Johnson 全源最短路径算法学习笔记
Johnson 全源最短路径算法学习笔记 如果你希望得到带互动的极简文字体验,请点这里 我们来学习johnson Johnson 算法是一种在边加权有向图中找到所有顶点对之间最短路径的方法.它允许一些 ...
- Johnson 全源最短路径算法
解决单源最短路径问题(Single Source Shortest Paths Problem)的算法包括: Dijkstra 单源最短路径算法:时间复杂度为 O(E + VlogV),要求权值非负: ...
- 模板C++ 03图论算法 2最短路之全源最短路(Floyd)
3.2最短路之全源最短路(Floyd) 这个算法用于求所有点对的最短距离.比调用n次SPFA的优点在于代码简单,时间复杂度为O(n^3).[无法计算含有负环的图] 依次扫描每一点(k),并以该点作为中 ...
- Johnson算法:多源最短路算法
Johnson算法 请不要轻易点击标题 一个可以在有负边的图上使用的多源最短路算法 时间复杂度\(O(n \cdot m \cdot log \ m+n \cdot m)\) 空间复杂度\(O(n+m ...
- Floyd-Warshall 全源最短路径算法
Floyd-Warshall 算法采用动态规划方案来解决在一个有向图 G = (V, E) 上每对顶点间的最短路径问题,即全源最短路径问题(All-Pairs Shortest Paths Probl ...
- 【算法】单源最短路——Dijkstra
对于固定起点的最短路算法,我们称之为单源最短路算法.单源最短路算法很多,最常见的就是dijkstra算法. dijkstra主要用的是一种贪心的思想,就是说如果i...s...t...j是最短路,那么 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
随机推荐
- 学习redis问题记录
2024年5月25日 倒腾了很长时间 突然发现的问题 ide提示改为toList() 我顺便就改过去了 但是实际业务中redis序列化会产生无法反序列化的问题 造成缓存挂壁 业务直接G collect ...
- java_类属性&对象属性
访问类属性方式有两种: 对象.类属性 类.类属性 但是理解上第一种方法存在小小小问题, 逻辑没问题 2022年7月31日18:44:29
- 【前端js】之小数点保留时的四舍五入问题
项目遇到金额小数点保留位数,极个别的数会差一分,经调查是因为js的问题. 解决办法: # 方法一:保留两位小数 function keepTwoDecimal(num) { var result = ...
- 原生JavaScript实现一个简单的Promise构造函数示例
下面demo示例,只支持实例的then和catch,代码如下: function PromiseDiffer(fn){ var self = this; this.status = 'pendding ...
- 工具 – Prettier、ESLint、Stylelint
前言 以前在 Webpack 学习笔记 有稍微介绍过它们.这篇是单独整理版. 参考 一文彻底读懂ESLint 你的ESLint真的需要Prettier吗? 搞懂eslint和prettier等的关系 ...
- JavaScript – Fetch
前言 上一篇 JavaScript – XMLHttpRequest 有提到 XMLHttpRequest 正在被 Fetch 取代,这篇就继续介绍 Fetch 吧. 参考 阮一峰 – Fetch A ...
- Redis 入门 - 收官
<Redis 入门>系列文章总算完成了,希望这个系列文章可以想入门或刚入门的同学提供帮助,希望能让你形成学习Redis系统性概念. 当时为什么要写这个系列文章,是因为我自己就是迷迷糊糊一路 ...
- JAVAEE——idea安装
一.安装idea 1.点击这里下载jar包 2.点击这里下载idea2019 提取码:1234 (也可自行官网下载付费版自行寻找破解) 3.下载后jar压缩包后解压,把里面那个jar文件随意放在 ...
- BFS 颜色填涂———洛谷p1162
填涂颜色 题目描述 由数字 \(0\) 组成的方阵中,有一任意形状的由数字 \(1\) 构成的闭合圈.现要求把闭合圈内的所有空间都填写成 \(2\).例如:\(6\times 6\) 的方阵(\(n= ...
- huge 发在家长群的图片