图论 - 从顶点A开始,经过两个方向的所有路径,然后以最短的方式再次以A结束

时间:2018-01-15 01:44:24

标签: c++ algorithm graph graph-theory graph-algorithm

我正在尝试找到此问题的名称,但实际上并不知道如何搜索它。问题如下:

  

在图表中找到从顶点A开始的路径   在两个方向上每个边缘正好两次通过所有边缘(一个   时间在一个方向,第二次在相反的方向)并最终进入   顶点A再次作为最后一步。

如果有人给我一些关于如何调用此问题的提示(因为它听起来像一个众所周知的人)并且可能是解决方案的一些方向,我会很高兴。

1 个答案:

答案 0 :(得分:4)

如果您只想在每个方向上遍历连接图的每个边,那么您可以使用深度优先搜索:

  • 选择任何顶点作为起点。
  • 从当前顶点开始,选择任何未访问的事件边缘。
    • 将该边缘标记为已访问。
    • 如果边缘的另一端是未访问的顶点,则移动到该新顶点,将其标记为已访问,然后从该新顶点重复该过程。
    • 如果边缘的另一端是访问顶点,则立即回溯(第二次遍历边缘,但方向相反)并继续处理连接到当前顶点的边缘。
    • 一旦访问了当前顶点的所有入射边缘,然后沿着最初将您带到该顶点的边缘回溯并返回到处理连接到该前一个顶点的边缘。

DFS完成后,您将在每个方向上遍历每个边缘一次。

您可以同样使用广度优先搜索而不是深度优先搜索。

如果你想访问一个循环中的所有边缘(在路径中间没有回溯),那么你正在寻找欧拉电路/巡回演出并且可以使用Hierholzer的1873算法:

Wikipedia

  
      
  • 选择任何起始顶点v,并沿着该顶点的边缘跟踪,直到返回到v。不可能卡在v以外的任何顶点,因为所有顶点的均匀度确保了进入另一个顶点w必须有一个未使用的边缘留下w。以这种方式形成的游览是封闭游览,但可能无法覆盖初始图形的所有顶点和边缘。
  •   
  • 只要存在属于当前巡视的顶点u但其相邻边不是巡视的一部分,则从u开始另一条路径,跟随未使用的边,直到返回到u,并加入以这种方式形成的巡回到上一次旅行。
  •