python-3.x - 如何检查图形是否包含负循环但无法从源头到达?
问题描述
我想检查我的加权图是否有负循环。对于使用 bellman-ford 算法,我们需要选择一个源节点,将所有其他距离初始化为无穷大,如果顶点数为 n,则开始放松 n-1 次。我的问题是无法到达的节点将始终具有无限距离,并且在第 n 次迭代中也不会改变。因此,对于无法到达的负循环,我们会得到错误的输出。
def negative_cycle(adj, cost):
dist = [float('inf')] * n
prev = [None] * n
dist[0] = 0
for _ in range(n-1):
for u, edges in enumerate(adj):
for i, v in enumerate(edges):
if dist[v]>dist[u]+cost[u][i]:
dist[v]=dist[u]+cost[u][i]
prev[v]=u
for u, edges in enumerate(adj):
for i, v in enumerate(edges):
if dist[v]>dist[u]+cost[u][i]:
return 1
return 0
解决方案
如果您不关心最短路径而只是想检测负循环,则可以将所有顶点的初始距离设置为 0。这与创建一个虚构的源s并将s连接到所有其他顶点具有相同的效果权重 0 边。
然后,您的代码将如下所示(可能我不懂 Python,所以我的语法可能不正确)。
def negative_cycle(adj, cost):
dist = [0] * n
prev = [None] * n
for _ in range(n-1):
for u, edges in enumerate(adj):
for i, v in enumerate(edges):
if dist[v]>dist[u]+cost[u][i]:
dist[v]=dist[u]+cost[u][i]
prev[v]=u
for u, edges in enumerate(adj):
for i, v in enumerate(edges):
if dist[v]>dist[u]+cost[u][i]:
return 1
return 0
推荐阅读
- rust - 在 Rust 2018 中跨模块调用函数时出现“未解析的导入”
- php - BadMethodCallException 调用未定义的方法 App\registeration::register()
- apache-spark - 是否可以在 hadoop3 集群上运行 Spark (2.3) 作业,特别是 HDP 3.1 和 CDH6 (beta)
- react-native - 访问 redux-persist 中的数据(react native)
- ios - 仅在加载所有数据时加载 CollectionView 单元格
- forms - 如何在 symfony 3 中创建自定义类型的数组表单字段?
- r - 合并两个具有重复值的数据框
- javascript - Testcafe-vue-selector 组件中没有数据绑定
- haskell - 为什么 Haskell 中的实例解析不考虑约束?
- reactjs - await 是 ReactJS 中的保留字错误