goldberg_radzik#

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

计算加权图中最短路径长度和前驱节点。

该算法的时间复杂度为 \(O(mn)\),其中 \(n\) 是节点数,\(m\) 是边数。它比 Dijkstra 算法慢,但可以处理负边权重。

Parameters:
GNetworkX 图

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

source: 节点标签

路径的起始节点

weight字符串或函数

如果这是一个字符串,则通过该键访问边属性来获取边权重(即,连接 uv 的边的权重为 G.edges[u, v][weight] )。如果没有这样的边属性,则假定边的权重为 1。

如果这是一个函数,则边的权重为该函数返回的值。该函数必须接受三个位置参数:边的两个端点和该边的边属性字典。该函数必须返回一个数字。

Returns:
pred, dist字典

返回两个字典,分别以节点为键,表示路径中的前驱节点和到源节点的距离。

Raises:
NodeNotFound

如果 source 不在 G 中。

NetworkXUnbounded

如果(有向)图包含负(有向)环,算法会抛出异常以指示负(有向)环的存在。注意:无向图中的任何负权重边都是一个负环。

从 NetworkX v3.2 开始,零权重环不再被错误地报告为负权重环。

Notes

边权重属性必须是数值。 距离计算为遍历的加权边之和。

返回的字典仅包含从源节点可达的节点。

在(有向)图不连通的情况下,如果一个不包含源节点的组件包含负(有向)环,则不会被检测到。

Examples

>>> 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.