goldberg_radzik#
- goldberg_radzik(G, source, weight='weight')[源代码]#
计算加权图中最短路径的最短路径长度和最短路径上的前置任务。
该算法的运行时间为 \(O(mn)\) 哪里 \(n\) 是节点数和 \(m\) 是边数。它比Dijkstra慢,但可以处理负边权重。
- 参数
- G网络X图表
该算法适用于所有类型的图,包括有向图和多重图。
- source: node label
路径的起始节点
- weight字符串或函数
如果这是一个字符串,则边权重将通过具有此关键字的边属性(即边连接的权重)进行访问
u
至v
将会是G.edges[u, v][weight]
)。如果不存在这样的边属性,则假定边的权重为1。如果这是一个函数,则边的权重是函数返回的值。函数必须只接受三个位置参数:边的两个端点和该边的边属性字典。函数必须返回一个数字。
- 返回
- pred, dist词典
返回两个字典,分别按路径中的前置节点和与源的距离作为关键字。
- 加薪
- NodeNotFound
如果
source
不在G
.- NetworkXUnbounded
如果(Di)图包含负(Di)圈,则该算法引发异常以指示负(Di)圈的存在。注:无向图中的任何负权边都是负圈。
笔记
边缘权重属性必须是数字。距离计算为经过加权边缘的总和。
返回的字典只有可从源访问的节点的键。
在未连接(Di)图的情况下,如果不包含源的组件包含负(Di)循环,则不会检测到它。
实例
>>> G = nx.path_graph(5, create_using=nx.DiGraph()) >>> pred, dist = nx.goldberg_radzik(G, 0) >>> sorted(pred.items()) [(0, None), (1, 0), (2, 1), (3, 2), (4, 3)] >>> sorted(dist.items()) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> G = nx.cycle_graph(5, create_using=nx.DiGraph()) >>> G[1][2]["weight"] = -7 >>> nx.goldberg_radzik(G, 0) Traceback (most recent call last): ... networkx.exception.NetworkXUnbounded: Negative cycle detected.