Algorithm 在双色图中查找具有交替颜色的路径

Algorithm 在双色图中查找具有交替颜色的路径,algorithm,graph,Algorithm,Graph,给我一个图G=(V,E),带有一个颜色函数C:E-->{red,blue}(例如,一条边可以用这两种颜色中的一种来着色) 我想找到一个路径,不一定简单(意味着该路径允许包含一个边或节点多次),它是交替的颜色-这意味着路径中每一条边的颜色都不同于路径中以前的颜色 没有更多的限制,但我被告知这可以在线性时间内实现。是的,你可以在线性时间内完成 由于路径需要跟随交替颜色的边,因此当路径到达每个特定顶点时,它可以处于3种状态:要么它刚穿过一条红色边,要么它刚穿过一条蓝色边,要么它是最开始的,还没有穿过任

给我一个图G=(V,E),带有一个颜色函数C:E-->{red,blue}(例如,一条边可以用这两种颜色中的一种来着色)

我想找到一个路径,不一定简单(意味着该路径允许包含一个边或节点多次),它是交替的颜色-这意味着路径中每一条边的颜色都不同于路径中以前的颜色


没有更多的限制,但我被告知这可以在线性时间内实现。

是的,你可以在线性时间内完成

由于路径需要跟随交替颜色的边,因此当路径到达每个特定顶点时,它可以处于3种状态:要么它刚穿过一条红色边,要么它刚穿过一条蓝色边,要么它是最开始的,还没有穿过任何东西

在每种状态下,可以从当前顶点遍历的边都是不同的

如果可以创建一个新的、更大的图形,每个可能的(顶点、状态)组合都有一个顶点,则可以将这些顶点与未着色的定向边从每个顶点连接到可以通过适当颜色的原始边到达的顶点

然后,您可以在新的有向图中执行DFS或BFS来查找路径


注意:创建新图形有助于理解,但并非绝对必要-BFS或DFS搜索算法很容易修改,以遍历新图形,而无需实际构建它。

当然,您可以使用两个参数定义DFS,一个用于当前节点,另一个用于上次访问的颜色,因此,在每个节点上,检查该节点的未访问顶点是否具有与上次访问的颜色相反的颜色,然后继续

dfs(int node,int lastColor)
   for(edge : graph[node])
      if(edge.color != lastColor)
         dfs(edge.pos,edge.color)

你能澄清你所说的“如果你能制作一个新的大型图形,每个可能的(顶点,状态)组合都有一个顶点”是什么意思吗?有很多这样的组合,不是吗?@IVlad:更大的图,也就是说,对于每个原始顶点
v
,你有两个新的顶点,
v_red
v_blue
,外加一个额外的
start
顶点。如果原始图有N个顶点,则新图有2N+1个顶点。可能相关: