goldberg_radzik#
- goldberg_radzik(G, source, weight='weight')[源代码]#
计算加权图中的最短路径长度和最短路径上的前驱节点。
该算法的运行时间为 \(O(mn)\),其中 \(n\) 是节点数,\(m\) 是边数。它比 Dijkstra 算法慢,但可以处理负边权重。
- 参数:
- GNetworkX 图
该算法适用于所有类型的图,包括有向图和多重图。
- source: 节点标签
路径的起始节点
- weight字符串或函数
如果这是一个字符串,则通过此键的边属性访问边权重(即,连接
u
到v
的边的权重将是G.edges[u, v][weight]
)。如果不存在此类边属性,则边的权重假定为一。如果这是一个函数,则边的权重是函数返回的值。该函数必须接受三个位置参数:边的两个端点以及该边的边属性字典。该函数必须返回一个数字。
- 返回:
- pred, dist字典
返回两个字典,分别以节点为键,对应于路径中的前驱节点和距源节点的距离。
- 抛出:
- NodeNotFound
如果
source
不在G
中。- NetworkXUnbounded
如果(有向)图中包含负(有向)环,算法会抛出异常以指示存在负(有向)环。注意:无向图中的任何负权重边都是一个负环。
自 NetworkX v3.2 起,零权重环不再被错误地报告为负权重环。
注意
边权重属性必须是数字。距离按遍历的加权边之和计算。
返回的字典只包含可从源节点到达的节点的键。
如果(有向)图不连通,且不包含源节点的组件中包含负(有向)环,则不会被检测到。
示例
>>> 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.