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
顶点到图中每个顶点之间的边的列表。 - 返回路径的字典。