Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Dijsktra';接受单个负边的s算法_Algorithm_Graph_Dijkstra_Directed Graph - Fatal编程技术网

Algorithm Dijsktra';接受单个负边的s算法

Algorithm Dijsktra';接受单个负边的s算法,algorithm,graph,dijkstra,directed-graph,Algorithm,Graph,Dijkstra,Directed Graph,所以我最近一直在研究Dijkstra的算法和有向图。然而,我似乎不明白这一点,这真的开始困扰我 演示如何修改Dijkstra算法以求解单源最短路径 只有一条负权重边但没有负权重边的路径问题 重量循环 到目前为止,我最初的想法是以某种方式分割图形并分别执行算法,但这就是我所想到的全部 我已经找到了我想要的解释,但我似乎无法理解 回答得好!我想指出的是,如果负边的数量是有限的,那么基于Dijkstra的算法可能会做得更好。例如,如果从u到v只有一条负边,您可以在s和v上运行Dijkstra,然后在d

所以我最近一直在研究Dijkstra的算法和有向图。然而,我似乎不明白这一点,这真的开始困扰我

演示如何修改Dijkstra算法以求解单源最短路径 只有一条负权重边但没有负权重边的路径问题 重量循环

到目前为止,我最初的想法是以某种方式分割图形并分别执行算法,但这就是我所想到的全部

我已经找到了我想要的解释,但我似乎无法理解

回答得好!我想指出的是,如果负边的数量是有限的,那么基于Dijkstra的算法可能会做得更好。例如,如果从u到v只有一条负边,您可以在s和v上运行Dijkstra,然后在
d[s]
d[s]+w(u,v)+d[v]
之间为每个顶点取最小值,这就增加了运行Dijkstra两次的复杂性


移除负边缘
(u,v)
,运行Dijkstra两次:一次从
s开始(
D1
),一次从
v开始(
D2


s
t
之间的最短路径是:
min(D1[t],D1[u]+D2[t]+w(u,v))

该线程仅引用Bellman-Ford方法的@orlp的可能重复。这是一个不同的算法。我想修改Dijkstra的算法,让它在一个只有一条负边的图上运行。为什么我们不能用最负的数增加所有边的权重,然后应用Dijkstra的???“因为在某些情况下,算法不能一直循环负边到负无穷大吗?”-不,因为有“没有负权重循环“这里只是说说而已:考虑到只有一个负权重边,没有负权重循环,你能在图上执行一个初始dijkstra,将负权重边替换为0吗?”。之后,可以将边重置为负值,并从该边延伸的节点向外传播?如果我能证明这是一个答案,我会把它贴出来。现在,在评论中,它被降级为推测。这不是假设负边缘总是沿着
u->v
方向穿过吗?是的,如果s和t之间的唯一链接是s->v->u->t,这就失败了。请参阅我的答案以了解更多信息case@Eric这是一个有向图。OP在问题中这样说。@Eric你不能在有向图上(v,u),至少不能在单负边上。