图论 - 从顶点 A 开始,经过两个方向的所有路径,并以最短的方式再次到达 A
Posted
技术标签:
【中文标题】图论 - 从顶点 A 开始,经过两个方向的所有路径,并以最短的方式再次到达 A【英文标题】:Graph theory - Start from vertex A, go through all paths in both directions and end up in A again the shortest way 【发布时间】:2018-01-15 01:44:24 【问题描述】:我正在尝试查找此问题的名称,但不知道如何搜索它。问题如下:
在图中找到从顶点 A 开始的路径,走 在两个方向上每条边恰好穿过所有边两次(一个 一个方向的时间,相反的第二次)并最终在 最后一步再次顶点 A。
如果有人给我一些关于如何调用这个问题的提示(因为这听起来像是一个众所周知的问题)以及可能解决它的一些方向,我会很高兴。
【问题讨论】:
我认为您正在描述一个欧拉循环 (en.wikipedia.org/wiki/Eulerian_path)(在将每条边分成一对有向边之后)。然而,任何这样的路径的长度都是相同的,即原始边缘长度总和的两倍。所以要求“最短”这样的路径没有多大意义。 @stewbasic:当且仅当每个顶点都具有偶数度(无向图)时,欧拉环才存在,而即使存在偶数度的边(例如度数 1),所描述的路径也可能存在。 @LiorKogan 如果如stevebasic 所建议的那样,您将每个无向边分成一对有向边(因为OP 要求每条边都在两个方向上传播),那么总会有相同数量的入站和每个顶点上的出边,因此您始终可以沿着刚刚遍历的边回溯(实际上,入射边的总数将始终是偶数)。 @MT0:你是对的。我错过了拆分部分。 【参考方案1】:如果您只想在每个方向上遍历连接图的每条边一次,那么您可以使用深度优先搜索:
选择任意顶点作为起点。 从当前顶点选择任何未访问的入射边。 将该边标记为已访问。 如果边的另一端是未访问的顶点,则移动到该新顶点,将其标记为已访问,然后从该新顶点重复该过程。 如果边的另一端是访问过的顶点,则立即回溯(第二次沿相反方向遍历边)并继续处理连接到当前顶点的边。 一旦访问了当前顶点的所有入射边,然后沿着最初将您带到该顶点的边回溯并返回处理连接到前一个顶点的边。DFS 完成后,您将在每个方向上准确地遍历每个边一次。
您同样可以使用广度优先搜索而不是深度优先搜索。
如果您想在一个循环中访问所有边(在路径中间不回溯),那么您正在寻找一个欧拉回路/游览,并且可以使用 Hierholzer 的 1873 算法:
Wikipedia
选择任何起始顶点 v,并沿着从该顶点开始的边轨迹直到返回 v。不可能在 v 以外的任何顶点处卡住,因为所有顶点的度数均等可确保,当轨迹进入另一个顶点 w 必须有一条未使用的边离开 w。这样形成的游览是一个封闭的游览,但可能不会覆盖初始图的所有顶点和边。 只要存在属于当前巡视但相邻边不属于巡视的顶点 u,则从 u 开始另一条路径,沿着未使用的边直到返回 u,并加入以这种方式形成的巡视到上一次巡演。
【讨论】:
以上是关于图论 - 从顶点 A 开始,经过两个方向的所有路径,并以最短的方式再次到达 A的主要内容,如果未能解决你的问题,请参考以下文章