我有一个带有彩色边缘(红色和蓝色)的有向图,可能包含周期。问题是编写一个给定两个顶点(s,t)的算法,找到s和t之间颜色变化最小的路径(如果存在这样的路径)。
我找到了一个使用Dijkstra变体的解决方案(我创建了一个新图形,其中每个顶点对应于上一个图形的边缘,并包含边缘的颜色。例如:if(1,2)是一个在旧图中的边缘,然后(1/2)是新图中的顶点。我连接“相邻边”顶点,并且新图中改变颜色的边的权重为1,其中相同的颜色过渡为0)
我正在寻找线性时间(V和E)的解决方案。上面的一个使用新图中的VxE边。
有没有找到最小路径的解决方案?
答案 0 :(得分:0)
第一阶段:减少到最短路径问题。
i
,我们创建了两个节点i_red
和i_blue
。 i->j
,我们创建两个边i_red->j_blue
,其中权重为1
,i_blue->j_blue
为权重0
。 start_red
和start_blue
相关联的起始节点,其连接权重为0
。target_red
和target_blue
连接,重量为0
- 连接。现在,搜索从新创建的起始节点到新创建的目标节点的最短路径。节点的数量是原始图形的两倍,边数是原始图形的两倍,因此减少是线性的。
将问题缩减为最短路径搜索后,您可以执行以下操作:
步骤:仅使用权重为0的边,将图表视为无向图,并且在bfs的帮助下,您可以在线性时间内找到此0边图中的所有组件。
步骤:在图表上运行bfs,其中前一步骤中的组件粘合在一起作为超级节点,因此所有边缘都具有权重1,bfs将找到最短路径。
显然,该算法的所有三个部分(0-edge-graph中的bfs,将组件粘合到超级节点以及生成的图中的bfs)都以线性时间运行。