具有彩色边缘的图表中具有最小更改次数的路径

时间:2017-04-16 09:33:05

标签: algorithm graph graph-algorithm edges

我有一个带有彩色边缘(红色和蓝色)的有向图,可能包含周期。问题是编写一个给定两个顶点(s,t)的算法,找到s和t之间颜色变化最小的路径(如果存在这样的路径)。

我找到了一个使用Dijkstra变体的解决方案(我创建了一个新图形,其中每个顶点对应于上一个图形的边缘,并包含边缘的颜色。例如:if(1,2)是一个在旧图中的边缘,然后(1/2)是新图中的顶点。我连接“相邻边”顶点,并且新图中改变颜色的边的权重为1,其中相同的颜色过渡为0)

我正在寻找线性时间(V和E)的解决方案。上面的一个使用新图中的VxE边。

有没有找到最小路径的解决方案?

1 个答案:

答案 0 :(得分:0)

第一阶段:减少到最短路径问题。

  1. 对于每个节点i,我们创建了两个节点i_redi_blue
  2. 对于每个蓝色边i->j,我们创建两个边i_red->j_blue,其中权重为1i_blue->j_blue为权重0
  3. 我们以类似的方式处理红色边缘。
  4. 我们还需要一个与start_redstart_blue相关联的起始节点,其连接权重为0
  5. 与目标节点类似,目标节点与target_redtarget_blue连接,重量为0 - 连接。
  6. 现在,搜索从新创建的起始节点到新创建的目标节点的最短路径。节点的数量是原始图形的两倍,边数是原始图形的两倍,因此减少是线性的。

    将问题缩减为最短路径搜索后,您可以执行以下操作:

    1. 步骤:仅使用权重为0的边,将图表视为无向图,并且在bfs的帮助下,您可以在线性时间内找到此0边图中的所有组件。

    2. 步骤:在图表上运行bfs,其中前一步骤中的组件粘合在一起作为超级节点,因此所有边缘都具有权重1,bfs将找到最短路径。

    3. 显然,该算法的所有三个部分(0-edge-graph中的bfs,将组件粘合到超级节点以及生成的图中的bfs)都以线性时间运行。