📅  最后修改于: 2023-12-03 15:00:24.949000             🧑  作者: Mango
Dijkstra算法是一种贪心算法解决最短路径问题,由荷兰计算机科学家Edsger W. Dijkstra于1956年提出。
该算法被广泛应用于计算机网络、交通路线规划、GPS导航等领域,是图论中最经典的算法之一。
Dijkstra算法借助一个优先队列(最小堆)来存储和访问未确定最短路径的节点。用一个visited[]数组记录每个节点是否已经被处理过,用一个dist[]数组记录源节点到其他节点的距离。算法流程如下:
初始化:将源节点s标记为已访问,dist[s]=0,将源节点的相邻节点的dist值设为对应边的权重,其他节点的dist值设为无穷大。将所有节点加入优先队列。
循环:从优先队列中取出最小距离的节点u,对u的相邻节点进行松弛操作:若dist[u]+w(u,v)<dist[v],则更新dist[v]的值为dist[u]+w(u,v)。
标记:将节点u标记为已处理。
终止:重复步骤2和3,直至优先队列为空。
import heapq
def dijkstra(graph, start):
# 初始化
visited = set()
dist = {node: float('inf') for node in graph}
dist[start] = 0
heap = [(0, start)]
while heap:
# 取出dist最小的节点
(d, u) = heapq.heappop(heap)
# 若该节点已被处理,则跳过
if u in visited:
continue
# 对u的相邻节点进行松弛操作
visited.add(u)
for v, w in graph[u].items():
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
heapq.heappush(heap, (dist[v], v))
return dist
import java.util.*;
public class DijkstraAlgorithm {
public static Map<String, Integer> dijkstra(Map<String, Map<String, Integer>> graph, String start) {
// 初始化
Set<String> visited = new HashSet<>();
Map<String, Integer> dist = new HashMap<>();
PriorityQueue<String> heap = new PriorityQueue<>((u, v) -> dist.get(u) - dist.get(v));
for (String node : graph.keySet()) {
dist.put(node, Integer.MAX_VALUE);
heap.add(node);
}
dist.put(start, 0);
while (!heap.isEmpty()) {
// 取出dist最小的节点
String u = heap.poll();
// 若该节点已被处理,则跳过
if (visited.contains(u)) {
continue;
}
// 对u的相邻节点进行松弛操作
visited.add(u);
for (String v : graph.get(u).keySet()) {
int w = graph.get(u).get(v);
if (dist.get(u) + w < dist.get(v)) {
dist.put(v, dist.get(u) + w);
heap.add(v);
}
}
}
return dist;
}
}
以下是一个示例网格地图,其中黑色区域表示障碍物。假设我们需要从起点S到终点T的最短路径,其中每个白色格子的距离都是1。
我们可以将网格地图表示为以下邻接矩阵:
graph = {
'A': {'B': 1, 'E': 1},
'B': {'A': 1, 'F': 1},
'C': {'D': 1, 'G': 1},
'D': {'C': 1, 'H': 1},
'E': {'A': 1, 'F': 1, 'I': 1},
'F': {'B': 1, 'E': 1, 'J': 1},
'G': {'C': 1, 'H': 1, 'K': 1},
'H': {'D': 1, 'G': 1, 'L': 1},
'I': {'E': 1, 'J': 1},
'J': {'F': 1, 'I': 1, 'K': 1},
'K': {'G': 1, 'J': 1, 'T': 1},
'L': {'H': 1, 'T': 1},
'S': {'A': 1},
'T': {'K': 1, 'L': 1}
}
我们可以使用dijkstra算法找出起点S到其他节点的最短路径,从而获得S到T的最短路径。
>>> dijkstra(graph, 'S')
{'A': 1, 'B': 2, 'C': inf, 'D': inf, 'E': 1, 'F': 2, 'G': inf, 'H': inf, 'I': 2, 'J': 3, 'K': inf, 'L': inf, 'S': 0, 'T': inf}
>>> dijkstra(graph, 'T')
{'A': inf, 'B': inf, 'C': inf, 'D': inf, 'E': inf, 'F': inf, 'G': inf, 'H': inf, 'I': inf, 'J': inf, 'K': 1, 'L': 1, 'S': inf, 'T': 0}
通过分析最短路径,我们可以得到如下结果:
Dijkstra算法是一种简单而又实用的算法,可以用于解决最短路径问题。在实际应用中,我们可以将地图等场景表示为邻接矩阵的形式,在程序中实现Dijkstra算法来求解最短路径。