johnson#
- johnson(G, weight='weight')[source]#
使用 Johnson 算法计算最短路径。
Johnson 算法计算加权图中每对节点之间的最短路径,即使图中存在负权边。
- 参数:
- GNetworkX 图
- weight字符串或函数
如果这是一个字符串,则通过该键访问边的权重属性(即,连接
u
到v
的边的权重将是G.edges[u, v][weight]
)。如果不存在这样的边属性,则边的权重假定为 1。如果这是一个函数,则边的权重是该函数返回的值。该函数必须接受恰好三个位置参数:边的两个端点以及该边的属性字典。该函数必须返回一个数字。
- 返回:
- distance字典
一个字典,键为源节点和目标节点,存储最短路径。
另请参阅
floyd_warshall_predecessor_and_distance
floyd_warshall_numpy
all_pairs_shortest_path
all_pairs_shortest_path_length
all_pairs_dijkstra_path
bellman_ford_predecessor_and_distance
all_pairs_bellman_ford_path
all_pairs_bellman_ford_path_length
注意
Johnson 算法甚至适用于存在负权边的图。其工作原理是使用 Bellman-Ford 算法计算输入图的转换,以消除所有负权边,从而允许在转换后的图上使用 Dijkstra 算法。
该算法的时间复杂度是 \(O(n^2 \log n + n m)\),其中 \(n\) 是节点数,\(m\) 是图中的边数。对于稠密图,这可能比 Floyd–Warshall 算法更快。
示例
>>> graph = nx.DiGraph() >>> graph.add_weighted_edges_from( ... [("0", "3", 3), ("0", "1", -5), ("0", "2", 2), ("1", "2", 4), ("2", "3", 1)] ... ) >>> paths = nx.johnson(graph, weight="weight") >>> paths["0"]["2"] ['0', '1', '2'] ----