给定有向图G,边缘颜色为绿色或紫色,G中有顶点S,我必须找到一个算法,找到从 G到s到每个顶点的最短路径,这样路径最多包含两个紫色边缘(和所需的绿色一样)。
在删除所有紫色边缘之后我想到了G上的BFS,并且对于最短路径仍然无穷大的每个顶点,做一些尝试找到它的东西,但是我有点卡住,并且它需要很多运行时间也是......
还有其他建议吗?
提前致谢
答案 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算法。
现在,检查路径长度:
n
,那么您的路径只有绿色边缘,因为即使一条紫色边缘也会增加路径长度超过n-1
; [n, 2n)
内,则您只有一条紫色边,因为两条或更多条紫色边将增加2n-1
以上的路径长度; [2n, 3n)
内,那么您只有两条紫色边,因为三条或更多条紫色边将增加3n-1
以上的路径长度;