43.Dijkstra的算法挑战¶
挑战1:分步图¶
给出以下图形,通过Dijkstra算法,从vertex A开始,产生通往其他每个顶点的最短路径。提供上一章所示的最后的路径表。

挑战2:寻找所有最短路径¶
在Dijkstra类中增加一个方法,返回一个给定起始顶点到所有顶点的最短路径的字典。下面是方法的签名,让你开始使用:
public func getAllShortestPath(from source: Vertex<T>)
-> [Vertex<T> : [Edge<T>]] {
var pathsDict = [Vertex<T> : [Edge<T>]]()
// Implement Solution Here
return pathsDict
}
解决方案¶
挑战1的解决方案¶

- 到
B的路径:A-(1)-B。 - 到
C的路径:A-(1)-B-(8)-C。 - 到
D的路径:A-(1)-B-(9)-D。 - 到
E的路径:A-(1)-B-(8)-C-(2)-E。
挑战2的解决方案¶
这个函数是Dijkstra.swift的一部分。要得到从source顶点到图中其他每个顶点的最短路径,请执行以下步骤:
public func getAllShortestPath(from source: Vertex<T>)
-> [Vertex<T> : [Edge<T>]] {
var pathsDict = [Vertex<T> : [Edge<T>]]() // 1
let pathsFromSource = shortestPath(from: source) // 2
for vertex in graph.vertices { // 3
let path = shortestPath(to: vertex, paths: pathsFromSource)
pathsDict[vertex] = path
}
return pathsDict // 4
}
- 字典中存储了从
source顶点到每个顶点的路径。 - 执行
Dijkstra算法,从source顶点找到所有的路径。 - 对于图中的每个顶点,生成
source顶点到图中每个顶点之间的边的列表。 - 返回路径的字典。