Algorithm 如何检查无向图是否有奇数长度圈

Algorithm 如何检查无向图是否有奇数长度圈,algorithm,graph,Algorithm,Graph,我试图找到一个O(| V |+| E |)时间算法来检查一个 无向图是否有奇数长度的圈 我正在考虑在图上进行广度优先搜索,并尝试将顶点标记为黑色和白色,以便没有两个标记为相同颜色的顶点相邻 有没有已知的更简洁的算法可以在线性时间内解决这个问题?你的方法是正确的。你做得再好不过了 工作的原因是,如果在执行BFS时按顶点的深度标记顶点,则所有边都会连接相同的标签或相差一个的标签。很明显,如果有一条边连接相同的标签,那么就有一个奇数周期。如果没有,我们可以将所有奇数标签涂成白色,将所有偶数标签涂成黑色

我试图找到一个O(| V |+| E |)时间算法来检查一个 无向图是否有奇数长度的圈

我正在考虑在图上进行广度优先搜索,并尝试将顶点标记为黑色和白色,以便没有两个标记为相同颜色的顶点相邻


有没有已知的更简洁的算法可以在线性时间内解决这个问题?

你的方法是正确的。你做得再好不过了


工作的原因是,如果在执行BFS时按顶点的深度标记顶点,则所有边都会连接相同的标签或相差一个的标签。很明显,如果有一条边连接相同的标签,那么就有一个奇数周期。如果没有,我们可以将所有奇数标签涂成白色,将所有偶数标签涂成黑色。

也可以使用DFS和顶点编号来完成

  • 时钟=1
  • 从顶点“s”开始,将其标记为“已访问”,然后调用“浏览”
  • 探索(u)

  • 如果u已经被“访问”,那么如果(clock Num[u])是奇数,那么就有一个奇数周期

    否则将“u”标记为“已访问”

  • Num[u]=时钟++

  • 对于u的所有相邻节点v

      i) Explore(v)
      ii) clock=Num[u]
    

  • 在初始化过程中,还需要将Num[s]=0