繁体   English   中英

为了找到最短路径,如何在有向加权图中将一个边精确设置为零?

[英]How to set exactly one edge to zero in directed weighted graph in order to find shortest path?

以下是我正在研究的问题:

考虑一个有向加权图G ,其中所有边缘权重均为正。 这个问题的目的是在两个预先指定的顶点st之间找到G的最短路径,但要增加一点扭曲:允许将(选择的)一条边的权重更改为零。

换句话说,您必须在G中选择一个边沿以将其设置为零,以最小化st之间最短路径。 给出一种有效的算法,以在O(E lg V)时间内实现此目标,并分析算法的运行时间。 次优解决方案将获得较少的信誉。

提示:您可能需要反转边缘,多次运行熟悉的算法,并做一些额外的工作

所以,我试图运行从s Dijkstra的所有其他节点,然后我试图逆转的边缘,从s再次运行到所有其他节点。 但是,我发现我们必须将Dijskstra从s运行到所有其他节点 ,然后反转边,然后再将Dijkstra从所有其他节点运行t 我不确定这如何帮助我们找到要设置为零的边。 根据我的直觉,我认为我们可以将最大重量边设置为零。 反转边缘的意义何在?

我们需要运行Dijkstra的算法两次-一次是使用s作为源顶点的原始图,一次是使用反向图并且t作为源顶点的图。 我们将表示从第一次运行得到的顶点si之间的距离为D(i) ,从第二次运行得到的顶点ti之间的距离为D_rev(i)

请注意,我们可以向后跟随反向边(即,沿原始方向跟随它们),因此D_rev(i)实际上是顶点it的最短距离。 同样, D(i)是遵循Dijkstra算法的从顶点si的最短距离。

现在我们可以遍历所有边缘,对于连接v1v2每个边缘e ,将D(v1)D_rev(v2) ,这对应于路径s -> v1 -> v2 -> t的权重s -> v1 -> v2 -> t D_rev(v2) s -> v1 -> v2 -> te为零边,因为我们可以从sv1且距离为D(v1) ,所以将e设置为0,从v1v2 ,然后从v2t的距离为D_rev(v2) 这些最小的答案。

粗略的证明草图(以及重述):如果将边e设置为0,但不在路径中使用它,则最好将路径中的边设置为0。因此,我们只需要考虑包括归零边缘的路径。 通过零边e的最短路径是首先采用从sv1的最短路径,然后采用从v2t的最短路径,这正是使用Dijkstra算法(即DD_rev计算D_rev

希望这个答案有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM