在彩色边缘图中找到最短的有效路径

时间:2011-11-26 16:33:22

标签: algorithm graph-theory graph-algorithm

给定有向图G,边缘颜色为绿色或紫色,G中有顶点S,我必须找到一个算法,找到从 G到s到每个顶点的最短路径,这样路径最多包含两个紫色边缘(和所需的绿色一样)。

在删除所有紫色边缘之后我想到了G上的BFS,并且对于最短路径仍然无穷大的每个顶点,做一些尝试找到它的东西,但是我有点卡住,并且它需要很多运行时间也是......

还有其他建议吗?

提前致谢

3 个答案:

答案 0 :(得分:5)

复制你的图形,所以你有G 1 ,G 2 ,G 3 ,你可以在每个图中重定向紫边,如下所示:if(u 1 ,v 1 )是G 1 中的紫色边缘,然后将其更改为(u 1 ,v 2 )。

即。你有三个图表,每次你采取紫色边缘它会移动到下一个图形,而在G 3 上没有紫色边缘。该构造将紫色限制构建到结构中,然后自动强制执行。

现在您可以像往常一样找到从s到所有节点的最短路径。根据结果​​,您必须选择从s到u 1 ,u 2 ,u 3 的每条路径之间的缩短时间。

总而言之,构造需要线性时间,并且新图形尺寸比原始尺寸大O(1)倍,因此APSP需要相同的时间,并且最终运行以确定找到的三条路径中的哪一条最短是也是线性的。

答案 1 :(得分:1)

每个顶点需要三条最短路径:具有0,1和2条紫色边的路径。在算法中,您需要在每个顶点存储三个不同的路径长度。当您考虑具有k个紫色边缘和边s-t的{​​{1}}路径时,如果边缘为绿色,则潜在t-u路径具有k个紫色边缘,如果s-t-u路径比具有k个紫色边缘的其他s-t-u路径短,您将其长度存储在顶点s-u的插槽k处。或者,如果u边是紫色,则使用顶点t-u的插槽k + 1。你可以自己解决剩下的事吗?

答案 2 :(得分:0)

请注意,与您的n个顶点相似的图表中没有循环的任何路径最多只能n-1

将长度n分配给每个紫色边缘,其中n是顶点数。找到从S到每个其他顶点的最短路径,例如,使用Dijkstra算法。

现在,检查路径长度:

  1. 如果路径长度小于n,那么您的路径只有绿色边缘,因为即使一条紫色边缘也会增加路径长度超过n-1;
  2. 如果路径长度在[n, 2n)内,则您只有一条紫色边,因为两条或更多条紫色边将增加2n-1以上的路径长度;
  3. 如果路径长度在[2n, 3n)内,那么您只有两条紫色边,因为三条或更多条紫色边将增加3n-1以上的路径长度;
  4. 否则不存在最多两条紫色边缘的路径。