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