算法起步之Dijkstra算法

简介: 原文: 算法起步之Dijkstra算法 友情提示:转载请注明出处【作者 idlear    博客:http://blog.csdn.net/idlear/article/details/19687579】                Dijkstra算法是解决带权重有向图上的单源最短路径问题,必须路径值都为正数。
原文: 算法起步之Dijkstra算法

友情提示:转载请注明出处【作者 idlear    博客:http://blog.csdn.net/idlear/article/details/19687579】        

       Dijkstra算法是解决带权重有向图上的单源最短路径问题,必须路径值都为正数。如果实现方式合适的话,他的运行时间要低于我们之前介绍的Bellman-Ford算法的运行时间。如果介绍Dijkstra算法的过程你会发现他其实跟我们直接介绍的prim算法非常的相似。他们都是维护一个最小优先队列,最小优先队列维护的值还是key,开始节点到当前节点的最短距离估计。我们不断的从最小优先队列里取节点,加入到我们集合s中,知道最小优先队列为空,则开始节点到所有节点的最短路径就被我们计算出来了,跟prim算法是一样的,也是运用了贪心算法。我们来看一下例图:


     

public class Dijkstra {
	
	private int max=10000;
	public void Dijkstra(int[][]map,int start,int end){
		ArrayList list =new ArrayList();
		for (int i = 0; i < map.length; i++) {
			if (i==start) {
				list.add(new Node(i,0,null));
			}else{
				list.add(new Node(i,max,null));
			}
		}
		
		while (!list.isEmpty()) {
			Collections.sort(list);
			Node n=(Node) list.remove(1);
			for (int i = 0; i < map.length; i++) {
				if (map[n.getId()][i]==0) {
					continue;
				}
				for (Object object : list) {
					Node e=(Node) object;
					relex(n,e,map[n.getId()][i]);
				}
			}
		}
		
		
		
	}
	public void relex(Node s,Node e,int length){
		if (e.getKey()>s.getKey()+length) {
			e.setKey(s.getKey()+length);
			e.setP(s);
		}
	}
	
	
	
}
class Node implements Comparable<Node>{
	private int id;
	private int key;
	private Node p;
	@Override
	public int compareTo(Node o) {
		if(this.getKey()>o.getKey()){
			return -1;
		}
		return 1;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getKey() {
		return key;
	}
	public void setKey(int key) {
		this.key = key;
	}
	public Node getP() {
		return p;
	}
	public void setP(Node p) {
		this.p = p;
	}
	public Node(int id, int key, Node p) {
		super();
		this.id = id;
		this.key = key;
		this.p = p;
	}
	
}

目录
相关文章
|
人工智能 算法 数据可视化
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-2
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
387 5
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
1490 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
机器学习/深度学习 编解码 算法
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
【机器人路径规划】基于迪杰斯特拉算法(Dijkstra)的机器人路径规划(Python代码实现)
833 4
|
算法 机器人 定位技术
基于机器视觉和Dijkstra算法的平面建筑群地图路线规划matlab仿真
本程序基于机器视觉与Dijkstra算法,实现平面建筑群地图的路径规划。通过MATLAB 2022A读取地图图像,识别障碍物并进行路径搜索,支持鼠标选择起点与终点,最终显示最优路径及长度,适用于智能导航与机器人路径规划场景。
|
算法 编译器 C++
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
【狂热算法篇】探秘图论之Dijkstra 算法:穿越图的迷宫的最短路径力量(通俗易懂版)
|
算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
路径规划算法 - 求解最短路径 - Dijkstra(迪杰斯特拉)算法
1801 0
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
基于Dijkstra算法的最优行驶路线搜索matlab仿真,以实际城市复杂路线为例进行测试
使用MATLAB2022a实现的Dijkstra算法在城市地图上搜索最优行驶路线的仿真。用户通过鼠标点击设定起点和终点,算法规划路径并显示长度。测试显示,尽管在某些复杂情况下计算路径可能与实际有偏差,但多数场景下Dijkstra算法能找到接近最短路径。核心代码包括图的显示、用户交互及Dijkstra算法实现。算法基于图论,不断更新未访问节点的最短路径。测试结果证明其在简单路线及多数复杂城市路况下表现良好,但在交通拥堵等特殊情况下需结合其他数据提升准确性。
|
资源调度 算法 定位技术

热门文章

最新文章