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