Python 3.x 贝尔曼·福特:-为什么有N-1次迭代来计算思维距离?
由于我是从教程视频中读到的,所以实现可能是错误的。感谢帮助,外部循环执行N-1次,因为最短路径不能包含更多边,否则最短路径将包含可以避免的循环Python 3.x 贝尔曼·福特:-为什么有N-1次迭代来计算思维距离?,python-3.x,algorithm,graph-theory,Python 3.x,Algorithm,Graph Theory,由于我是从教程视频中读到的,所以实现可能是错误的。感谢帮助,外部循环执行N-1次,因为最短路径不能包含更多边,否则最短路径将包含可以避免的循环 次要:如果有N个顶点和N条边,则至少使用1个顶点两次,因此这样的路径将包含一个循环。外部循环执行N-1次,因为最短路径不能包含更多边,否则最短路径将包含一个可以避免的循环 次要:如果有N个顶点和N条边,则至少会使用1个顶点两次,因此这样的路径将包含一个循环。与Djkstra不同的是,该算法不是贪婪的,而是动态的。在循环的第一次迭代中,它在两个顶点之间构建
次要:如果有N个顶点和N条边,则至少使用1个顶点两次,因此这样的路径将包含一个循环。外部循环执行N-1次,因为最短路径不能包含更多边,否则最短路径将包含一个可以避免的循环
次要:如果有N个顶点和N条边,则至少会使用1个顶点两次,因此这样的路径将包含一个循环。与Djkstra不同的是,该算法不是贪婪的,而是动态的。在循环的第一次迭代中,它在两个顶点之间构建一条可能的路径,然后在每次迭代中,它至少通过一条边改进路径。由于最短路径可以使用最大n-1条边,因此循环的迭代将继续进行,以找到最短路径
对于负循环,算法在第n次迭代时再次检查边是否存在,以减少具有n-1条边的最短路径的权重。如果是,则该边必须是负的,因为所有正边的最短路径应由n-1条而不是n条边组成。与Djkstra不同,该算法不是贪婪的,而是动态的。在循环的第一次迭代中,它在两个顶点之间构建一条可能的路径,然后在每次迭代中,它至少通过一条边改进路径。由于最短路径可以使用最大n-1条边,因此循环的迭代将继续进行,以找到最短路径
对于负循环,算法在第n次迭代时再次检查边是否存在,以减少具有n-1条边的最短路径的权重。如果是,则该边必须是负的,因为具有所有正边的最短路径应由n-1条而不是n条边组成。您可以使用任何图形,并确保它没有负边和循环,并使用正确的边顺序(根据拓扑排序顺序选择具有源顶点的边)您只需将每个边放松一次,就可以在一次迭代中找到答案。
当我们考虑到不以逻辑模式获取边,并以随机方式处理它时,n-1项就出现了。您可以获取任何图形,并确保它没有负边和循环,并采用正确的边顺序(根据拓扑排序顺序选择具有源顶点的边)您只需将每个边放松一次,就可以在一次迭代中找到答案。
当我们考虑到我们不以逻辑模式取边,而是以随机方式处理它时,n-1术语就出现了。请参考下面有说服力的stackoverflow链接回答:请参考下面有说服力的stackoverflow链接回答:你把它复杂化了,第二个答案很清楚,你说的不是真的。我同意,但我已经用我的一些时间段添加了解释。这个答案是在问题发生的那天。你把它弄得更复杂了,第二个答案很清楚,你说的不是真的。我同意,但我已经用一些时间段添加了解释。这个答案是在问题发生的那天。
def calculateShortestPath(self,vertexList,edgeList,startVertex):
startVertex.minDistance=0
for i in range(0,len(vertexList)-1):#N-1 ITERATION
for edge in edgeList:
#RELAXATION PROCESS
u=edge.startVertex
v=edge.targetVertex
newDistance=u.minDistance+edge.weight
if newDistance<v.minDistance:
v.minDistance=newDistance
v.predecessor=u
for edge in edgeList:# FINAL ITERATION TO DETECT NEGATIVE CYCLES
if self.hasCycle(edge):
print("NEGATIVE CYCLE DETECTED")
self.HAS_CYCLE=True
return
N-Length of the Vertex List.
Vertex List-contains the different vertex.
EdgeList-List of the different Edges.