图的Dijkstra算法

本文深入探讨了Dijkstra算法,这是一种用于寻找图中两点间最短路径的经典算法。通过详细解释算法步骤并提供Java代码实现,展示了如何计算一个节点到图中所有其他节点的最短距离。该算法首先初始化距离表,然后不断选择未被访问过的距离最小的节点,更新其相邻节点的距离,直至遍历完整个图。Dijkstra算法在路由、网络优化等领域有着广泛应用。

Dijkstra算的是一个点到图中所有点的最小距离。

思路:假设我们需要求的是到点A的距离。我们需要一张距离表,表示A点到其他点的距离,如果这张表中没有一个点,那就表示A点到那个表中的距离为无穷大。

每次选取一个距离A最小的点进入,通过这个距离最小的点,可以使得距离表中的某些数据发生更新。然后继续选择一个距离最小的点,选择过的点是不可以重复再选的。

	public static Map<Node,Integer> dijkstra(Node node){
		//距离表
		HashMap<Node,Integer> distanceMap = new HashMap<Node, Integer>();
		//自己到自己的距离为0,其他点还没有加进来,距离就是无穷大。
		distanceMap.put(node, 0);
		//选择过的距离最下的点是不可再选的。
		HashSet<Node> selectedNodes = new HashSet<>();
		//找出距离表中距离最小,且没有被选中过的点
		Node minNode = getMinDistanceAndUnselectedNode(distanceMap,selectedNodes);
		//每次从距离表中选择一个最小的点,更新距离表,直到所有的点都被选择过了
		while(minNode!=null) {
			int distance = distanceMap.get(minNode);
			for(Edge edge:minNode.edges) {
				Node toNode = edge.to;
				//如果距离表中没有包含这个点,那默认就是距离无穷大。
				if(!distanceMap.containsKey(toNode)) {
					distanceMap.put(toNode, distance+edge.weight);
				}
				//原本的距离跟加入新的点之后的距离进行比较,选较小的那一个。
				distanceMap.put(toNode, Math.min(distance+edge.weight,
						distanceMap.get(toNode)));
				
			}
			//将使用过的点加入到选择表中
			selectedNodes.add(minNode);
			//再挑选一个距离最小的点进行更新。
			minNode = getMinDistanceAndUnselectedNode(distanceMap, selectedNodes);

		}
		
		
		
		return distanceMap;
	}
	
	public static Node getMinDistanceAndUnselectedNode(
			HashMap<Node,Integer> distanceMap,
			HashSet<Node> selectedNode) 
	{
		Node minNode = null;
		int minDistance = Integer.MAX_VALUE;
		for(Entry<Node,Integer> entry:distanceMap.entrySet()) {
			Node node = entry.getKey();
			int distance = entry.getValue();
			if(!selectedNode.contains(node) && distance<minDistance) {
				minNode = node;
				minDistance = distance;
			}
		}
		
		return minNode;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值