P5905 【模板】Johnson 全源最短路
发布日期:2021-11-02 09:49:02
浏览次数:2
分类:技术文章
本文共 2689 字,大约阅读时间需要 8 分钟。
P5905 【模板】Johnson 全源最短路
代码实现
#includeusing namespace std;const int N = 5005;const int M = 60006;const int INF = 1e9;struct edge { long long v, w, next;} e[M];struct node { int id; long long w; const bool operator<(const node &a) const { return a.w < w; }};int cnt, n, m;int head[M], inq[M], vis[M], num[N];long long dis[M], ndis[M];void add(int u, int v, int w) { cnt++; e[cnt].v = v; e[cnt].w = w; e[cnt].next = head[u]; head[u] = cnt;}bool spfa(int s) { queue q; for (int i = 1; i <= n; i++) { dis[i] = INF, inq[i] = 0; } inq[s] = 1; dis[s] = 0; q.push(s); while (!q.empty()) { int fro = q.front(); q.pop(); inq[fro] = 0; for (int i = head[fro]; i; i = e[i].next) { int nv = e[i].v; if (dis[nv] > dis[fro] + e[i].w) { dis[nv] = dis[fro] + e[i].w; if (!inq[nv]) { inq[nv] = 1; q.push(nv); if (++num[nv] >= n + 1) { return 1; } } } } } return 0;}void Dijkstra(int s) { priority_queue Q; for (int i = 1; i <= n; i++) ndis[i] = INF, vis[i] = 0; ndis[s] = 0; Q.push((node) { s, 0}); while (!Q.empty()) { int fro = Q.top().id; Q.pop(); if (vis[fro]) { continue; } vis[fro] = 1; for (int i = head[fro]; i; i = e[i].next) { int nv = e[i].v; if (ndis[nv] > ndis[fro] + e[i].w) { ndis[nv] = ndis[fro] + e[i].w; if (!vis[nv]) { Q.push({ nv, ndis[nv]}); } } } } return;}int main() { cin >> n >> m; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; add(u, v, w); } for (int i = 1; i <= n; i++) { add(0, i, 0); } if (spfa(0)) { // 若图中存在负环,输出-1 cout << -1; return 0; } for (int i = 1; i <= n; i++) { for (int j = head[i]; j; j = e[j].next) { e[j].w += dis[i] - dis[e[j].v]; } } // dis[i][j]为从 i 到 j 的最短路, // 在第 i 行输出 从1到n j*dis[i][j] 的累加 for (int i = 1; i <= n; i++) { Dijkstra(i); long long ans = 0; for (int j = 1; j <= n; j++) { if (ndis[j] == INF) { ans += 1ll * j * INF; } else { ans += 1ll * j * (ndis[j] + dis[j] - dis[i]); } } cout << ans << endl; } return 0;}
转载地址:https://blog.csdn.net/weixin_43820352/article/details/111871540 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月16日 12时37分41秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Oracle篇--05 Oracle 视图、序列、约束
2019-04-26
【Java面试题四】sql面试题(1)
2019-04-26
【Java面试题五】sql面试题(2)
2019-04-26
【Java面试题六】多线程篇
2019-04-26
【Java面试题七】Java泛型篇
2019-04-26
【Java面试题八】Java算法优化篇
2019-04-26
JDBC与DAO篇--01 JDBC原理、JDBC基础编程
2019-04-26
【Java面试题九】算法篇
2019-04-26
Struts2+Hibernate4开发学生信息管理功能之---(一)环境搭建
2019-04-26
Struts2+Hibernate4开发学生信息管理功能--(三)用户登录模块
2019-04-26
Struts2+Hibernate4开发学生信息管理功能--(四)学生信息管理模块
2019-04-26
Git的使用--如何将本地项目上传到Github
2019-04-26
【Java面试题九】一套面试题
2019-04-26
【Java面试题十】一套完整的java面试题
2019-04-26
JDBC与DAO篇--03 JDBC高级编程、DAO
2019-04-26
WEB_BASIC---08 jQuery事件处理、jQuery动画
2019-04-26
SERVLET JSP篇-02 HTTP协议、Servlet原理
2019-04-26
SERVLET JSP篇-03 Servlet特性
2019-04-26