bellman_ford_predecessor_and_distance#

bellman_ford_predecessor_and_distance(G, source, target=None, weight='weight', heuristic=False)[源代码]#

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

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

如果检测到负循环,则可以使用 find_negative_cycle() 将循环返回并进行检查。当存在负循环时,不定义最短路径,因为一旦到达,路径可以永远循环以建立任意低的权重。

参数
G网络X图表

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

source: node label

路径的起始节点

target节点标签,可选

路径的结束节点

weight字符串或函数

如果这是一个字符串,则边权重将通过具有此关键字的边属性(即边连接的权重)进行访问 uv 将会是 G.edges[u, v][weight] )。如果不存在这样的边属性,则假定边的权重为1。

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

heuristic布尔尔

确定是否使用启发式来早期检测负循环,希望成本可以忽略不计。

返回
pred, dist词典

返回两个字典,分别按路径中的前置节点和与源的距离作为关键字。

加薪
NodeNotFound

如果 source 不在 G .

NetworkXUnbounded

如果(Di)图包含负(Di)圈,则该算法引发异常以指示负(Di)圈的存在。注:无向图中的任何负权边都是负圈。

笔记

边缘权重属性必须是数字。距离计算为经过加权边缘的总和。

返回的字典只有可从源访问的节点的键。

在未连接(Di)图的情况下,如果不包含源的组件包含负(Di)循环,则不会检测到它。

在NetworkX 2.1及以前版本中,源节点具有前置节点 [None] . 在NetworkX v2.2中,此更改为具有前置任务的源节点 []

实例

>>> G = nx.path_graph(5, create_using=nx.DiGraph())
>>> pred, dist = nx.bellman_ford_predecessor_and_distance(G, 0)
>>> sorted(pred.items())
[(0, []), (1, [0]), (2, [1]), (3, [2]), (4, [3])]
>>> sorted(dist.items())
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> pred, dist = nx.bellman_ford_predecessor_and_distance(G, 0, 1)
>>> sorted(pred.items())
[(0, []), (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.bellman_ford_predecessor_and_distance(G, 0)
Traceback (most recent call last):
    ...
networkx.exception.NetworkXUnbounded: Negative cycle detected.