dijkstra算法步骤例题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dijkstra算法步骤例题
Dijkstra算法是解决单源最短路径问题的常用算法。
其思路是
通过累计最短路径来逐渐扩展到所有节点。
Dijkstra算法的基
本流程如下:
1. 创建一个空堆和一个空seen集合。
堆中包含每个节点到起
始节点的距离值和节点本身。
2. 将起始节点插入堆中,并将其距离值设为0。
3. 当堆不为空时,取出堆中距离值最小的节点。
如果此节点在seen中,跳过。
否则,将其标记为seen,并计算其邻居节点
到起始节点的距离值。
如果邻居节点的距离值未被计算过或新距离值比已计算的距离值小,更新其距离值。
最后,将其加入堆中以备下一次取最小距离值使用。
4. 重复上述步骤3,直至堆为空或者所有节点距离值都被计算。
下面通过一个例子来详细解释Dijkstra算法的具体实现过程:
假设我们有如下图所示的一个简单的有向加权图,其中每个节点代表一个城市,每条有向边代表两个城市之间的道路,其权重表示两座城市之间的距离。
![image.png](attachment:image.png)
设起点为A,我们使用Dijkstra算法来求出从A到图中其余各
个节点的最短距离和路径。
具体步骤如下:
1. 创建空的distance字典保存每个节点到起点A的距离,创建
空的parents字典保存最短路径上的每个节点的前一个节点,创建空的visited集合保存已经访问过的节点,创建初始堆,将A压入堆中,距离设置为0。
```
distance = {A: 0}
parents = {A: None}
visited = set()
heap = [(0, A)]
```
2. 当堆不为空时,取出堆中最小距离值对应的节点,并加入visited中。
```
while heap:
(curr_dist, curr_node) = heapq.heappop(heap)
if curr_node in visited:
continue
visited.add(curr_node)
```
3. 对于当前节点的每个邻居,计算其到起点的距离值并更新distance和parents。
```
for neighbor, weight in graph[curr_node].items():
if neighbor in visited:
continue
new_dist = curr_dist + weight
if neighbor not in distance or new_dist < distance[neighbor]: distance[neighbor] = new_dist
parents[neighbor] = curr_node
heapq.heappush(heap, (new_dist, neighbor))
```
4. 重复步骤2和3,直至堆为空或者所有节点的距离值都被计算。
完整的Python实现代码如下:
```
import heapq
def dijkstra_algorithm(graph, start):
distance = {start: 0}
parents = {start: None}
visited = set()
heap = [(0, start)]
while heap:
(curr_dist, curr_node) = heapq.heappop(heap)
if curr_node in visited:
continue
visited.add(curr_node)
for neighbor, weight in graph[curr_node].items():
if neighbor in visited:
continue
new_dist = curr_dist + weight
if neighbor not in distance or new_dist <
distance[neighbor]:
distance[neighbor] = new_dist
parents[neighbor] = curr_node
heapq.heappush(heap, (new_dist, neighbor))
return distance, parents
# Test case
graph = {
'A': {'B': 6, 'D': 1},
'B': {'A': 6, 'C': 5, 'D': 2, 'E': 2},
'C': {'B': 5, 'E': 5},
'D': {'A': 1, 'B': 2, 'E': 1},
'E': {'B': 2, 'C': 5, 'D': 1}
}
distance, parents = dijkstra_algorithm(graph, 'A')
print(distance) # {'A': 0, 'B': 3, 'C': 10, 'D': 1, 'E': 2}
print(parents) # {'A': None, 'B': 'D', 'C': 'B', 'D': 'A', 'E': 'D'}
```
在这个例子里,我们可以看到从A到其他各个节点的最短路径距离分别是0,3,10,1和2,且这些最短路径是分别经过A-D,A-D-B-E,A-D-B,A-D和A-D-E这些节点的。