有向无环图的单源最短路径

算法导论 24.2 有向无环图的单源最短路径(DAG算法) 一,DAG算法的思想        根据结点的拓扑排序次序来对带权重的有向无环图G进行边的松弛操作,在有向无环图中,边可以为负值但是没有权重为负值的环,因此最短路都是存在的。二,DAG算法介绍准备阶段:一副赋值有向无环图算法过程:对图G中的结点进行拓扑排序就,使所有结点线性排列,然后按照拓扑排序的次序对每个结点发出的所有边进行松弛操作。三,DAG伪代码DAG_SHORTEST_PATHS(G,w,... 阅读详情

发布一个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.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;

public class OrderedGraphicShortestPath {
	private Node [][]graphic;
	private Node s;
	private Set<Node> nextNodes=new HashSet<Node>();
	private Set<Node> addList=new HashSet<Node>();
	private Set<Node> removeList=new HashSet<Node>();
	private int time=0;
	private List<Node> sortList=new ArrayList<Node>();
	public OrderedGraphicShortestPath(int v,int e){
		graphic=new Node[v][v];
		for(int i=0;i<e;i++){
			int v1=new Random().nextInt(v);
			int v2=new Random().nextInt(v);
			if(v2<v1){
				continue;
			}
			Node node=new Node();
			node.d=Integer.MAX_VALUE-1000;
			node.w=new Random().nextInt(e);
			node.start=v1;
			node.end=v2;
			graphic[v1][v2]=node;
			
		}
		for(int i=0;i<v;i++){
			if(graphic[i][i]==null){
				Node node=new Node();
				node.d=Integer.MAX_VALUE-1000;
				node.w=new Random().nextInt(e);
				node.start=i;
				node.end=i;
				node.color=Node.WHITE;
				graphic[i][i]=node;
			}else{
				graphic[i][i].color=Node.WHITE;
			}
		}
		depthFirstSearch();
		s=sortList.get(0);
		s.d=0;
	}
	
	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);
		}
	}
	private void depthFirstSearch(){
		for(int i=0;i<graphic.length;i++){
			if(graphic[i][i].color==Node.WHITE){
				dfsVisit(graphic[i][i]);
			}
		}
	}
	
	private void dfsVisit(Node node){
		time++;
		node.s=time;
		node.color=Node.GRAY;
		for(int i=0;i<graphic.length;i++){
			if(i!=node.start){
				Node w=graphic[node.start][i];
				if(w!=null){
					if(graphic[i][i].color==Node.WHITE){
						graphic[i][i].color=Node.GRAY;
						graphic[i][i].oparent=node;
						dfsVisit(graphic[i][i]);
					}
				}
			}
		}
		node.color=Node.BLACK;
		time++;
		node.f=time;
		sortList.add(0, node);
	}
	public void printSort(){
		System.out.println("sort===========");
		for(int i=0;i<sortList.size();i++){
			System.out.print(sortList.get(i).start+"  ");;
		}
		System.out.println();
	}
	public void shortestPath(){
		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);
			
		}

		
	}
	
	public void  print(){
		for(int i=0;i<graphic.length;i++){
			for(int j=0;j<graphic[i].length;j++){
				if(graphic[i][j]==null){
					System.out.print(-1+"|"+-1+"|"+-1+"  ");
				}else{
					System.out.print(graphic[i][j].start+"|"+graphic[i][j].end+"|"+graphic[i][j].w+"  ");
				}
				
			}
			System.out.println();
		}
	}
	
	public void printPath(){
		List<Integer> indexList=new ArrayList<Integer>();
		List<Integer> removeList=new ArrayList<Integer>();
		List<Integer> addList=new ArrayList<Integer>();
		indexList.add(sortList.get(0).start);
		while(indexList.size()>0){
			removeList.clear();
			addList.clear();
			for(int x=0;x<indexList.size();x++){
				int l=indexList.get(x);
				removeList.add(l);
				for(int j=0;j<graphic.length;j++){
					if(graphic[j][j].parent==graphic[l][l]){
						graphic[l][l].children.add(graphic[j][j]);
						addList.add(j);
					}
				}
				
			}
			indexList.removeAll(removeList);
			indexList.addAll(addList);
		}
		
		Node h = this.s;
        this.print(0, h,h);
            
		
		
		System.out.println();
	}

	     
 private void print(int level,Node parent, Node node){
     for (int i = 0; i < level; i++) {
         System.out.format(" ");
     }
     System.out.format("|");
     if(parent!=node){
    	 System.out.print("("+graphic[parent.start][node.end].w+")");
	     for (int i = 0; i < level; i++) {
	         System.out.format("-");
	     }
     }else{
    	 for (int i = 0; i < level; i++) {
	         System.out.format("-");
	     }
     }
     
     System.out.format("%d%n", node.start);
     List<Node> children = node.children;
     for(int i=0;i<children.size();i++){
    	 print(level+1,node,children.get(i));
     }
               
 }
	
	private class Node{
		private static final int WHITE=1;
		private static final int GRAY=2;
		private static final int BLACK=3;
		private int color;
		private int d;
		private int s;
		private int f;
		private int w;
		private int start;
		private int end;
		private Node oparent;
		private Node parent;
		private List<Node> children=new ArrayList<Node>();
	}
	public static void main(String[] args) {
		OrderedGraphicShortestPath o=new OrderedGraphicShortestPath(5,20);
		o.print();
		//o.depthFirstSearch();
		o.printSort();
		o.shortestPath();
		o.printPath();
	}

}

 

深度优先搜索与有向无环图的拓扑排序(java实现) NULL 博文链接:https://128kj.iteye.com/blog/1675685 立即下载

相关推荐

有向无环图的最短路径

使用C++实现有向无环图的最短路径,对正在学习算法的同学应该挺有帮助的

多段图 java 邻接表_(C/C++)动态规划:多段图最短路径、有向无环图最短路径、最长递增不连续子序列...

多段图的最短路径问题建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从S到T的最短路径值,并输出相应的最短路径。例图改为序号下标思路动态规划首先确定能分段,即每一层的各个结点互不连通,后驱结点均在同一层。通过有一定修改的bfs进行分段,然后从最后一段,依段数逐段取最小路径,有点类似最小路径算法。#include #include #include #define NODE_COUNT 8...

weixin_39615257的博客 404

别再纠结选哪个向量库了!我用Spring AI + Redis Stack 7.2,5分钟搞定企业知识库RAG原型

本文介绍了如何利用Spring AI和Redis Stack 7.2快速构建企业级RAG应用,解决向量数据库选型难题。Redis Stack 7.2集成了RediSearch模块,支持向量相似性搜索,具备高性能、低成本、零学习成本等优势,特别适合中小团队快速搭建知识库系统。通过实战代码示例,展示了从环境准备到核心功能实现的完整流程。

weixin_29061041的博客 275

【笔试/面试】—— 有向无环图(DAG)的最短路径问题(动态规划)

W:权重图 d[u]:u 到终点的距离 s、t:始点和终点 def dag_sp(W, s, t, d): if s == t: return 0 if s not in d: d[s] = min(W[s][v] + dag_sp(W, v, t, d) for v in W[s]) return d[s]DAG = { 'a': {

4866

直流电动机的建模仿真(1)他励,串励和并励电动机建模仿真

本文根据不同励磁方式的直流电动机的接线原理图,建立了相应的数学模型,然后根据与数学模型对应的等效电路以及模拟机械运动方程的等效电路,用Matlab/simulink中的SpecializedPower system库中的电路元件,建立了他励,并励和串励直流电动机的全等效电路仿真模型,经过与Matlab自带的直流电动机仿真模型比较以及仿真实例验证,所建立的仿真模型时完全正确的。

weixin_45670943的博客 7521

便携式水下动态实时视频色彩还原设备,一键快速实现对水下偏色视频和图像的色彩还原处理

便携式水下动态实时视频色彩还原,一键快速对水下图像进行色彩校正,清晰度提升和亮度均衡处理,为水下资源勘探和科学考古,海洋生态环境监测,水下机器作业等应用提供有力的协助

weixin_43518680的博客 633

有向无环图的单源最短路径----拓扑排序+松弛

算法开始对DAG图进行拓扑排序,以便获得结点的线性序列;当对线性序列进行处理时,松弛从该点出发的所有边。 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列, 使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。 若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的 利用DFS现实拓

cai0612123的专栏 1153

【图像超分】论文精读:Interpreting Super-Resolution Networks with Local Attribution Maps(LAM)

论文题目:Interpreting Super-Resolution Networks with Local Attribution Maps —— 用局部归因图解释超分辨率网络CVPR 2021!必读文章!必须会的可视化手段!很多文章中都会对比LAM!图像超分辨率 (SR) 技术发展迅速,受益于深度网络的发明及其连续突破。然而,众所周知,深度学习和深度神经网络很难解释。SR网络继承了这种神秘的性质,很少有作品试图理解它们。在本文中,我们对 SR 网络进行了归因分析。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 548

单源最短路径 Bellman-Ford 算法 和 有向无环图中的单源最短路径问题

1、Bellman-Ford 算法 它解决一般情况下的单源最短路径问题,允许边的权重为负值。同时对于给定的有向图G=(V, E)和权重函数w:E→R,它返回一个判断在路径中是否存在权重为负值的环路的布尔值。 Bellman_Ford(G, w, s) Initialize_Single_Source(G, s) for i = 1 to |G.V| - 1 for each edge(u, v)∈ G.E Relax(u, v, w) for each edge(u, v)∈G

Ho_mu_ra的博客 820

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 376

PCB板Gerber文件的理解和制作

Gerber文件是PCB生产的关键文件,主要包括:1)走线层(GTL/GBL);2)阻焊层(GTS/GBS);3)丝印层(GTO/GBO);4)板框层(GMx/GKO);5)钢网层(Gtp/GBp);6)钻孔文件(NCdrillFiles)。其中1-10项和15项钻孔文件必须提供,建议包含11-14项辅助钻孔层。Gerber文件不含过孔属性,需提前在AD中设置过孔盖油。导出步骤包括:导出非机械层、机械层和钻孔层,新版AD可通过"文件->制造输出->GerberFiles"操作

qq_37999850的博客 854

有向无环图的单源最短路径问题

#include #include #include #include using namespace std; //定义边结构体类型 struct Edge { int start;//一条边的起始顶点编号 int end;//一条边的终止顶点编号 int value;//边的权值 Edge* next;//第start起点的链表的下一条边 Edge(int s,int e,int v

相思作坊半世离殇的博客 792

Whisper 模型在嘈杂环境中的表现:降噪与增强技术

本报告系统分析了OpenAI Whisper模型在嘈杂环境中的表现机制,重点揭示其内在降噪能力的技术边界,并结合语音增强(SE)、时频分析等前沿技术提出优化方案。内容覆盖从基础概念(如噪声类型对ASR的影响)到理论框架(模型架构与数学形式化),再到实际应用(端到端部署策略)的全链路分析,同时通过案例研究与可视化工具(如梅尔频谱对比图)降低复杂概念的认知门槛。核心结论指出:Whisper的多语言预训练虽提升了泛化性,但在低信噪比(SNR<5dB)场景下需结合前端降噪或联合训练技术以突破性能瓶颈。

AI 原生应用开发的博客 489

POJ3249 工作难题(DAG有向无环图的单源最短路径)

有N个城市,它们之间存在一些单向路径,若可以从城市i到城市j,则一定无法从城市j到达城市i,只出不入的城市称为源点城市,只入不出的城市称为终点城市。已知到达某个城市就可以获得或者失去一定的钱财。现在狗先生从某个源点出发,到达某个终点停止,他想拥有尽量多的钱财。要求给出最多的钱财是多少。 题目给定的是一个有向无环图。最多的钱财可以转换成最短路径问题,每条边的权重其实就是到达该边的终点得到或失去的钱

Shuyu Fang 1846

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

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【经典算法】从原理到实战:一文吃透有向无环图中的单源最短路径问题

本文介绍了有向无环图(DAG)中的单源最短路径问题及其基于拓扑排序的解决方法。文章从地图导航等生活实例引入主题,详细阐述了DAG的概念及其在任务调度、课程安排等场景中的应用。针对单源最短路径问题,提出了基于拓扑排序的高效算法,包括拓扑排序步骤和松弛操作,并给出了Python实现代码。通过一个项目管理案例,展示了如何利用该算法计算任务的最短时间路径和项目关键路径。最后,文章总结了算法要点并推荐了进一步学习方向,包括Dijkstra、Bellman-Ford等其他最短路径算法。该算法具有O(V+E)的时间复杂度

大雨淅淅的博客 1306

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NC158 有向无环图的单源最短路径问题:Dijkstra算法

描述 在一个有向无环图中,已知每条边长,求出1到n的最短路径,返回1到n的最短路径值。如果1无法到n,输出-1 示例1 输入: 5,5,[[1,2,2],[1,4,5],[2,3,3],[3,5,4],[4,5,5]] 返回值: 9 备注: 两个整数n和m,表示图的顶点数和边数。 一个二维数组,一维3个数据,表示顶点到另外一个顶点的边长度是多少 每条边的长度范围[0,1000]。 注意数据中可能有重边 #include <vector> #include <iostream> #in

柔水终成雕刀 773

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法导论:Bellman-Ford算法以及基于拓扑排序的有向无环图单源最短路径问题

1. Bellman-Ford算法 实现c/c++代码如下: /** Initialize-single-source(G,s): for each vertex v in V: v.d <- OO v.p <- NIL s.d <- 0 Relax(u,v): if u.d + w(u,v) < v.d: v.d <- u.d + w(u,v) v.p <- u Bell

diadestiny的博客 463

有向无环图DAG的拓扑排序与单源最短路径求解:可以有负权边,但不能有回路(即使正权环)

1、有向无环图的拓扑排序: 用深度优先搜索后 节点结束时间逆序排序 得到的序列为拓扑序列,例: 1.1、伪代码描述: 可以在O(V+E)时间内完成拓扑排序,因为DFS运行时间为O(V+E)。 2、有向无环图的单源最短路径: 2.1、图中节点初始化伪代码: void initializeSingleSource(Graph* G, node& s){ for(each node in 顶点集合V){ node.d = 无穷大; // 初始化距离无穷大 node.pre = NULL;

个人工作中学到的专业技术与职业发展知识笔记 703

有向无环图求单源最短路径问题

1,有向无环图可以用拓扑排序先求得拓扑序列;对于得到的拓扑序列,我们遍历一遍,对于每一个元素,我们看它的邻接边,(因为拓扑序列中当前元素只可能存在指向在它之后的元素的边),对它的邻接边做松弛操作,这样一遍过后,就得到了给定源节点的单源最短路径! 2,时间复杂度分析: 拓扑排序的时间复杂度为O(n+e),遍历一遍拓扑序列,以及松弛操作的代价为O(n+e);所以总的时间代价为O(n+e). 3,

记录每一个小阶段的学习心得,持之以恒! 1861

单源最短路径(有向无环图)

1适用于有向无环图求最短路径 2将算法稍微改进,即可求关键路径 3运行时间与邻接表的大小呈线性关系 算法思想: 1:对图进行拓扑排序; 2 :init_signal_source(g, s); 3:按拓扑序列取出的顶点v,对与v相邻的顶点u进行relax(v,u,w); # include<iostream> # include<cstring> # include<...

艾克 691

图——单源最短路径(三)加权有向无环图中的最短路径算法

图——单源最短路径(三)加权有向无环图中的最短路径算法 在许多应用中的加权有向图都是不包含有向环的,因此对于这些图可以采用一种将拓扑排序和顶点的放松结合起来的算法,该算法与Dijkstra算法之间的区别: (1)比Dijkstra算法更快且更简单的最短路径算法,该算法是; (2)Dijkstra算法要求加权有向图中的边的权重非负,而该算法能够处理负权重的边。 1. 算法思想 目标 对于一个无环加权...

hh66__66hh的博客 2920

有向无环图单源最短路径问题

参考《算法4》,其中库用到该书自带的algs4.jar。 欢迎交流。 转载于:https://www.cnblogs.com/112358nizhipeng/p/9153438.html

weixin_30507269的博客 226

动态规划 “自底向上” 的典型应用:有向无环图(DAG)中使用动态规划求解单源最短路径(C语言实现)

创建一个图数据结构(使用邻接矩阵表示)。实现动态规划算法,计算从起点(节点0)到终点(节点7)的最短路径长度和具体路径。释放内存以避免泄漏。测试和输出结果。代码的关键部分包括图的管理(makeGraph和freeGraph)、动态规划计算(主函数中的循环部分)和路径回溯(while部分,用于保存最优路径所经节点到path数组)。

Hanpy268的博客 522
上一篇: 单源最短路径-Bellman-Ford算法
下一篇: 单源最短路径-Dijkstra算法
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、付费专栏及课程。

余额充值