我给出了图G =(V,E),颜色函数C:E - > {红色,蓝色}(例如,边缘可以用这两种颜色中的一种颜色着色)< / p>
我想找到一条路径,不一定简单(意味着允许路径不止一次包含一个边或节点),它在颜色上交替变换 - 这意味着路径中每条边的颜色与路径中的上一个颜色不同。
没有任何限制,但我被告知这可以在线性时间内实现。
答案 0 :(得分:2)
是的,您可以在线性时间内完成此操作。
由于路径需要跟随交替颜色的边缘,因此当它到达每个特定顶点时,它可以处于3种状态:要么只是遍历红色边缘,要么只是遍历蓝色边缘,或者它是非常开始,还没有走过任何东西。
在每个状态中,可以从当前顶点遍历的边是不同的。
如果你可以创建一个新的,更大的图形,每个可能的(顶点,状态)组合都有一个顶点,那么你可以将那些顶点与每个顶点的未着色的定向边连接到顶点你可以通过适当颜色的原始边缘到达。
然后你可以在新的有向图中做一个DFS或BFS来找到路径。
注意:创建新图形对于理解非常有用,但并非严格必要 - 可以轻松修改BFS或DFS搜索算法以遍历新图形,而无需实际构建它。
答案 1 :(得分:0)
当然,您可以使用2个参数定义dfs,一个用于当前节点,另一个用于最后一个访问颜色,因此在每个节点检查该节点的未访问顶点是否具有上次访问颜色的相反颜色继续。
dfs(int node,int lastColor)
for(edge : graph[node])
if(edge.color != lastColor)
dfs(edge.pos,edge.color)