goldberg_radzik#

goldberg_radzik(G, source, weight='weight')[源代码]#

计算加权图中最短路径的最短路径长度和最短路径上的前置任务。

该算法的运行时间为 \(O(mn)\) 哪里 \(n\) 是节点数和 \(m\) 是边数。它比Dijkstra慢,但可以处理负边权重。

参数
G网络X图表

该算法适用于所有类型的图,包括有向图和多重图。

source: node label

路径的起始节点

weight字符串或函数

如果这是一个字符串,则边权重将通过具有此关键字的边属性(即边连接的权重)进行访问 uv 将会是 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.