图的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;
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值