johnson方法求所有节点对最短路径

算法学习笔记 全源最短路径Johnson算法(用于稀疏图和有负边的图) 文章目录1. 重新赋予权重来维持最短路径2. 通过重新赋值来生成非负权重3. 计算所有结点对之间的最短路径 参考内容: 算法导论 第三版 25.3 用于稀疏图的Johnson算法 Johnson算法可在 O(V2log⁡V+VE)O(V^2 \log V +VE)O(V2logV+VE) 的时间内,找到所有结点对之间的最短路径。对于稀疏图(边比较少)来说,Johnson算法的渐进表现要优于 asymptotically faster 重复平方法 repeated squaring of matrices 阅读详情

发布一个k8s部署视频:https://edu.youkuaiyun.com/course/detail/26967

课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。

腾讯课堂连接地址https://ke.qq.com/course/478827?taid=4373109931462251&tuin=ba64518

第二个视频发布  https://edu.youkuaiyun.com/course/detail/27109

腾讯课堂连接地址https://ke.qq.com/course/484107?tuin=ba64518

介绍主要的k8s资源的使用配置和命令。包括configmap,pod,service,replicaset,namespace,deployment,daemonset,ingress,pv,pvc,sc,role,rolebinding,clusterrole,clusterrolebinding,secret,serviceaccount,statefulset,job,cronjob,podDisruptionbudget,podSecurityPolicy,networkPolicy,resourceQuota,limitrange,endpoint,event,conponentstatus,node,apiservice,controllerRevision等。

第三个视频发布:https://edu.youkuaiyun.com/course/detail/27574

详细介绍helm命令,学习helm chart语法,编写helm chart。深入分析各项目源码,学习编写helm插件
————————————————------------------------------------------------------------------------------------------------------------------

 

package com.data.struct;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;

public class Johnson {
	private Node[][] graphic;
	private Node[][] origonal;
	private Node [][]result;
	private Node s;
	private Set<Node> nextNodes = new HashSet<Node>();
	private Set<Node> addList = new HashSet<Node>();
	private Set<Node> removeList = new HashSet<Node>();

	public Johnson(int v, int e) {
		origonal = new Node[v][v];
		result=new Node[v][v];
		for (int i = 0; i < e; i++) {
			int v1 = new Random().nextInt(v);
			int v2 = new Random().nextInt(v);
			Node node = new Node();
			node.w = new Random().nextInt(v) + 1;
			node.d = Integer.MAX_VALUE - 1000;
			node.start = v1;
			node.end = v2;
			origonal[v1][v2] = node;
		}
		for (int i = 0; i < v; i++) {
			if (origonal[i][i] == null) {
				Node node = new Node();
				node.d = Integer.MAX_VALUE - 1000;
				node.w = 0;
				node.start = i;
				node.end = i;
				origonal[i][i] = node;
			} else {
				origonal[i][i].w = 0;
			}
		}
		graphic = new Node[v + 1][v + 1];
		for (int i = 0; i < origonal.length; i++) {
			for (int j = 0; j < origonal.length; j++) {
				graphic[i][j] = origonal[i][j];
			}
		}
		for (int i = 0; i < v + 1; i++) {
			Node node = new Node();
			node.start = origonal.length;
			node.d = Integer.MAX_VALUE - 1000;
			node.end = i;
			graphic[origonal.length][i] = node;
		}

		s = graphic[0][0];
		s.d = 0;

	}

	public Node[][] johnson() {
		if (!bellmanFord()) {
			System.out.println("matrix contain negtive cycle");
			return null;
		} else {
			printTmp();
			for (int i = 0; i < graphic.length; i++) {
				graphic[i][i].h = graphic[graphic.length - 1][i].d;
			}
			for (int i = 0; i < graphic.length; i++) {
				for (int j = 0; j < graphic.length; j++) {
					if (graphic[i][j] != null) {
						graphic[i][j].w = graphic[i][j].w + graphic[i][i].h
								- graphic[j][j].h;
					}
				}
			}
			for(int i=0;i<origonal.length;i++){
				dijkstra(origonal[i][i]);
				printResult();
				for (int j = 0; j < graphic.length; j++) {
					if (graphic[i][j] != null) {
						graphic[i][j].d = graphic[i][j].d - graphic[i][i].h
								+ graphic[j][j].h;
					}
				}
			}
		}
		return result;
	}

	public Node extractMin() {
		Iterator<Node> it = nextNodes.iterator();
		Node node = null;
		while (it.hasNext()) {
			if (node == null) {
				node = it.next();
			} else {
				Node n = it.next();
				if (n.d < node.d) {
					node = n;
				}
			}
		}
		return node;
	}

	public void dijkstra(Node s) {
		for(int i=0;i<origonal.length;i++){
			for(int j=0;j<origonal.length;j++){
				if(origonal[i][j]!=null){
					origonal[i][j].d=Integer.MAX_VALUE - 1000;
				}
			}
		}
		s.d=0;
		nextNodes.clear();
		for (int i = 0; i < origonal.length; i++) {
			nextNodes.add(origonal[i][i]);
		}
		for (int k = 0; k < origonal.length; k++) {
			if (k != s.start && origonal[s.start][k] != null) {
				relex(s, origonal[k][k]);
			}
		}
		nextNodes.remove(s);
		while (nextNodes.size() > 0) {
			Node node = extractMin();
			for (int k = 0; k < origonal.length; k++) {
				if (k != node.start && origonal[node.start][k] != null) {
					relex(node, origonal[k][k]);
				}
			}
			nextNodes.remove(node);
		}
		for(int i=0;i<origonal.length;i++){
			Node node=new Node();
			node.start=s.start;
			node.end=i;
			node.d=origonal[i][i].d;
			result[s.start][i]=node;
		}
	}

	public void relex(Node u, Node v) {
		if (graphic[v.end][v.end].d > u.d + graphic[u.start][v.start].w) {
			graphic[v.end][v.end].d = u.d + graphic[u.start][v.start].w;
			graphic[v.end][v.end].parent = u;
			addList.add(graphic[v.end][v.end]);
			System.out.println(graphic[v.end][v.end].start + "=>" + u.start
					+ "||" + graphic[v.end][v.end].d);
		}
	}

	public boolean bellmanFord() {
		s = graphic[graphic.length - 1][graphic.length - 1];
		s.d = 0;
		addList.clear();
		nextNodes.clear();
		removeList.clear();
		nextNodes.add(s);
		for (int k = 0; k < graphic.length; k++) {
			if (k != s.start && graphic[s.start][k] != null) {
				relex(s, graphic[k][k]);
			}
		}
		nextNodes.addAll(addList);
		nextNodes.remove(s);
		while (nextNodes.size() > 0) {
			addList.clear();
			removeList.clear();
			Iterator<Node> it = nextNodes.iterator();
			while (it.hasNext()) {
				Node node = it.next();
				for (int k = 0; k < graphic.length; k++) {
					if (k != node.start && graphic[node.start][k] != null) {
						relex(node, graphic[k][k]);
					}
				}
				removeList.add(node);
			}
			nextNodes.removeAll(removeList);
			nextNodes.addAll(addList);

		}

		for (int j = 0; j < graphic.length; j++) {
			for (int k = 0; k < graphic.length; k++) {
				if (j != k) {
					if (graphic[j][k] != null
							&& graphic[k][k].d > graphic[j][j].d
									+ graphic[j][k].w) {
						return false;
					}
				}
			}
		}
		return true;

	}
	public void printResult() {
		System.out.println("result:");
		for (int i = 0; i < result.length; i++) {
			for (int j = 0; j < result.length; j++) {
				if (result[i][j] != null) {
					System.out.print(result[i][j].d + " ");
				} else {
					System.out.print(" " + " ");
				}
			}
			System.out.println();
		}
	}
	public void printTmp() {
		System.out.println("tmp:");
		for (int i = 0; i < graphic.length; i++) {
			for (int j = 0; j < graphic.length; j++) {
				if (graphic[i][j] != null) {
					System.out.print(graphic[i][j].d + " ");
				} else {
					System.out.print(" " + " ");
				}
			}
			System.out.println();
		}
	}

	public void print() {
		System.out.println("origranal:");
		for (int i = 0; i < graphic.length; i++) {
			for (int j = 0; j < graphic.length; j++) {
				if (graphic[i][j] != null) {
					System.out.print(graphic[i][j].w + " ");
				} else {
					System.out.print(" " + " ");
				}
			}
			System.out.println();
		}

		Node[][] l = johnson();
		System.out.println("result:");
		for (int i = 0; i < l.length; i++) {
			for (int j = 0; j < l.length; j++) {
				if (l[i][j] != null) {
					System.out.print(l[i][j].d + " ");
				} else {
					System.out.print(" " + " ");
				}
			}
			System.out.println();
		}

	}

	private class Node {
		private int d;
		private int w;
		private int start;
		private int end;
		private Node parent;
		private int h;
	}

	public static void main(String[] args) {
		Johnson j = new Johnson(5, 20);
		j.print();

	}

}

 

算法——所有节点对的最短路径:Floyd-Warshall算法、Johnson算法 所有节点对的最短路径 前言 前面介绍了单源最短路径问题,本文是介绍所有节点对的最短路径问题,首先我们会想到用前面所介绍的知识来求解该问题,根据不同类型的图可以用一下几种方法求解: 1、  若无权重的图,则可以使用|V|次BFS,时间复杂度是O[V*(V+E)]; 2、  若为非负权重边的图,则可以使用|V|次Dijkstra算法,不同的优先队列实现得到不同的时间复杂度:①线性数组,O(V3 阅读详情

相关推荐

所有节点对最短路径

我们这里讲解三个算法,第一个是利用传统的动态规划,第二个也是个动态规划算法,但是基于一种观察结果,他就是warshall算法,第三个算法是将问题转换为没有负数权重的图,再对每个节点调用Dijkstra算法,他就是Johnson算法。

Founder Watts的博客 1万+

所有结点对的最短路径问题之Johnson算法

Johnson算法可以在O(V*V lgV + VE)的时间内找到所有节点对之间的最短路径,对于稀疏图来说,算法的渐进表现要由于重复平方法和FloydWarshall算法,如果图没有权值为负值的环路,则返回所有结点对的最短路径权重的矩阵,否则,报告图有权值为负的环 算法中运用Diskra、BellmanFord算法,使用的技术是重新赋予权重, 如果图G = (V, E)中权值全为非负值,则通过

豆子的collection 1万+

所有节点对的最短路径问题

前面在《单源最短路径》中我们接触了最短路径问题,并介绍了求解最短路径问题的算法,比如Bellman-Ford算法,Dijkstra算法。不过,那里我们计算的是从一个固定的源节点到所有其他点的最短路径。假如我们要想求任意节点对之间的最短路径呢?一个方法是以所有节点作为源节点调用上述比如Dijkstra算法,如果使用二叉堆实现最小优先队列时间复杂度为O(VElgV),如果使用斐波那契堆来实现最小优先队

wyc的专栏 6761

算法导论 所有结点最短路径问题 Johnson

1

苦海无涯闯进来 544

稀疏图Johnson算法

在前面的文章《所有节点对的最短路径问题》中,我们介绍了用于稀疏图的Johnson算法,由于代码比较长,我们将其单独放在一篇文章之中。 Johnson算法的时间复杂度在使用二叉堆作为最小优先队列的情况下为O((V^2 + EV)lgV);在使用斐波那契堆作为最小优先队列的时候为O(V^2lgV + VE),因此尤其是在稀疏图的情况下,其效率要比Floyd-Warshall高。 下面给出Java实

wyc的专栏 3920

多源最短路径求解: Floyd-Warshall算法和Johnson 算法

本文介绍图论中多源最短路径算法. 主要讲述Floyd-Warshall算法.

一些C++相关的技术笔记或者教程. 1241

算法导论-上课笔记12:所有结点对的最短路径问题

给定带权重的有向图G,希望找到任意一对结点间的最短路径

我是一只小嵩鼠 1702

Johnson(流水作业调度的最优算法)

Johnson(流水作业调度的最优算法),算法思想基于动态规划,里面包含了公式的推导与poj例题的简单实现的代码

johnson最短路径

Johnson算法是求稀疏图的多元最短路径的算法,权值可以为负,但是不可以有负环。Johson算法是Bellman-Ford算法, Reweighting(重赋权重)和Dijkstra算法的大综合。主要的思想是使用dijstra算法对每个结点求单源最短路,但是dijstra不能解决有负权值的边,所有需要给边重新赋值,且赋值后最短路径与原来的最短路径的距离和path相同。使用斐波那契堆作为优先级队列

zhj_fly的博客 1510

AD2S1210与DSP28335 SPI通信中的GPIO配置陷阱与解决

本文深入剖析了AD2S1210与DSP28335进行SPI通信时,因GPIO输入限定配置不当导致数据整体右移的典型问题。文章指出,错误地将MISO引脚配置为带采样周期的同步模式是根本原因,并提供了将输入选择限制正确设置为异步模式的解决方案。同时,总结了不同应用场景下GPIO输入限定的配置原则,为高速同步通信的稳定实现提供了关键指导。

weixin_29163857的博客 147

【实战解析】RTL8306MB交换芯片驱动开发中的RMII接口调试陷阱

本文通过一个RTL8306MB交换芯片驱动开发的实战案例,深入剖析了RMII接口调试中的经典陷阱。文章详细描述了因TX_EN与CRS_DV信号线交叉连接错误导致的“静默”故障,并分享了使用逻辑分析仪和示波器进行硬件排查的完整流程与核心技巧,为嵌入式网络驱动开发提供了宝贵的避坑指南。

weixin_29267307的博客 421

Johnson全源最短路径算法

Johson 算法通过一种方法来给每一条重新标注边权。我们新建一个虚拟节点,可编号为 0,设这个点连接其它所有点的边权为 0。接下来跑 Bellman-Ford 算法求出从0结点到其它所有点的最短路,记为 h[i]。那么就可用 h[i] 重新设置边的边权(如下)。接下来以每个点跑 n 轮 Dijkstra 算法即可求出任意两点间的最短路了。假如存在一条从 u 到 v 的结点,边权为 w 的边,则我们将该边的边权重新设置为whu−hvwhu−hv。

2301_80129631的博客 917

网络设备心跳线带宽高导致虚拟化平台不稳定的问题处理

本文记录了网络设备心跳线带宽高导致虚拟化平台不稳定的问题处理一例。

forestqq的博客 2229

全源最短路封装模板(APSP,Floyd求最小环,Floyd求最短路,Johnson算法)

Floyd,Johnson,最小环,全源最短路

surtr1的博客 1150

QT5.14.2离线安装包保姆级教程:断网、选组件、避坑全记录

本文详细介绍了QT5.14.2离线安装包的完整流程,特别针对Windows平台开发者提供断网安装、组件选择及避坑指南。作为QT5系列中最后一个免费离线版本,5.14.2具有免注册、全组件离线安装等独特优势,是开源开发者的理想选择。文章涵盖从环境准备到安装后配置的全方位指导,帮助开发者高效完成安装并避免常见问题。

weixin_30924087的博客 578

vue2学习笔记2-老规矩,从Hello World开始,了解Vue实例和模板

想要把“Hello,World”放置在页面上,首先需要准备一个HTML的块级元素div,来承接内容。

l_q_l的专栏 1259

Johnson 全源负权最短路径算法详解

Floyd-Warshall算法可以求解出图内任意两点的最短路径,适用于稠密图,但时间复杂度为 O(n3)O(n³)O(n3);Dijkstra算法求解单源最短路径的时间复杂度为 O(m+nlogn)O(m + n log n)O(m+nlogn),对每个节点都做一次,也可以达成全源最短路径,但是这个方法仅适用于非负权边图。 Johnson 算法被设计来解决此问题,其支持负权边(当然不能有负权环...

weixin_36773617的博客 202

Oracle EBS和华为MetaERP在会计科目(COA)设计上的观察非常精准。这两种设计确实代表了两种截然不同的系统架构思想,我们可以从设计哲学、优劣对比和演进关系三个方面进行深入分析。

OracleEBS与华为MetaERP的COA设计对比分析 OracleEBS采用弹性域架构,通过固定段数字符串实现多维度核算,强调稳定性和全球统一标准,但修改成本高、扩展性受限。华为MetaERP采用解耦架构,将核算单元、自然科目和核算维度分离,支持动态扩展和灵活调整,更适合业务快速变化的企业。 OracleEBS优势在于强一致性和成熟稳定,劣势是灵活性差;华为MetaERP优势是极致灵活性,劣势是对管理要求高。两者代表了不同时代的企业软件设计理念:OracleEBS适合标准化需求,MetaERP则面向快

金牌架构师 433

解锁稀疏图最短路径密码:Johnson算法深度剖析

本文系统介绍了Johnson算法,一种解决稀疏图中所有顶点对最短路径问题的高效算法。该算法-assisted通过添加你有什么 set虚拟源点、Bellman-Ford检测负权环、运费调整边权重和Dijkstra计算 hit路径等步骤,巧妙处理了负权边 recommend问题。文章详细剖析了算法原理、实现流程(包括Python代码示例)和性能分析,并通过城市 удешевление网络案例验证了其适用性。Johnson算法的时间复杂度为O(V²logV+VE),在稀疏图中显著优于Floyd-Warshall算

大雨淅淅的博客 1075

结构力学仿真软件:STAAD.Pro:结构抗震设计与STAAD.Pro应用_2024-08-10_11-49-29.Tex

STAAD.Pro是一款广泛应用于结构工程领域的仿真软件,由Bentley Systems开发。它能够进行结构分析和设计,支持多种结构类型,包括桥梁、建筑物、塔架等。STAAD.Pro提供了强大的建模工具,用户可以轻松创建复杂的结构模型,并进行静态和动态分析。软件还支持多种载荷组合,包括地震载荷,以及提供详细的报告和图纸输出,便于工程师进行设计和审查。STAAD.Pro是一款广泛应用于结构工程设计的软件,其界面直观,功能强大,能够进行结构分析与设计。菜单栏。

977

YOLOv8的特征蒸馏代码应用讲解(CWD/MGD/mimic/在线蒸馏/逻辑蒸馏)

基于YOLOv8的逻辑蒸馏、特征蒸馏、在线蒸馏等方法代码介绍。

qq_41920323的博客 2584

Johnson 全源最短路径算法 Java实现

Johnson 全源最短路径算法 Java实现

我家有只小金毛的博客 810

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

最短路—Johnson算法(解决负权边,判断负权环)

最短路—Johnson算法(解决负权边,判断负权环)

pursuit的博客 7615

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

全源最短路(Johnson)

Johnson算法是一种高效处理带负权边的全源最短路径算法。通过添加超级源点并使用SPFA计算势能函数h(i),将边权重新赋值为w'(u,v)=w(u,v)+h[u]-h[v]使其非负。然后对每个顶点跑Dijkstra算法,最后通过dis[u][v]=dis'[u][v]-h[u]+h[v]还原实际最短路。该算法时间复杂度为O(nm + n²logn),优于Floyd的O(n³),且能处理负权边(无负环情况)。文中给出了完整实现代码,包括SPFA检测负环和Dijkstra计算最短路的核心步骤。

pythonwyw123321的博客 1344

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Johnson算法

为什么80%的码农都做不了架构师?>>> ...

weixin_33806509的博客 3181
上一篇: mahout推荐引擎源码分析
下一篇: mapreduce推荐
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值