从门票

时间:2016-09-27 17:35:52

标签: algorithm data-structures graph-algorithm

今天我遇到了一个我无法解决的问题。

经常旅行的人会收集他所有的旅行机票。 票证只有2个属性,即“开始旅程位置”名称和“目的地名称”。从德里到纽约的例子。 在年底,旅行者将所有门票汇总在一起,并试图绘制他一年中的旅程。以可读格式打印他可能的旅行路线。他不记得他的起始位置。他可以多次访问某个地点,也可以多次往返一个地方。

最初我认为可以简单地通过制作图表来解决(票证-A到B表示有向边A-> B)并且使用来自具有indegree 0(??)的节点的简单深度优先遍历。但后来我意识到这不是解决问题的正确方法,因为它可以打印一条随机的无连接路线 请建议正确的方法继续。

1 个答案:

答案 0 :(得分:0)

首先,您应该检查您的图表是否有欧拉轨迹或欧拉周期。

  

当且仅当每个顶点都有时,有向图具有欧拉循环   度数和出度相等,所有顶点都非零   度属于单个强连通分量。同样地,   有向图有一个欧拉循环,当且仅当它可以   分解为边缘不相交的有向循环及其所有顶点   非零度数属于单个强连通分量。

     

当且仅当最多一个顶点时,有向图具有欧拉轨迹   有(out-degree) - (in-degree)= 1,最多一个顶点有(in-degree)    - (out-degree)= 1,每个其他顶点具有相等的in-degree和   out-degree,其所有非零度的顶点都属于a   基础无向图的单个连通分量。

如果你的图表有一个欧拉循环,你可以从任意节点开始你的DFS,你可以确定你的路径是正确的。

如果您的图表有Eulerian跟踪,请首先找到(out-degree) − (in-degree) = 1的节点并将其命名为source,然后找到(in-degree) − (out-degree) = 1的节点并将其命名为sink。您应该从source开始DFS,并尽可能避免前往sink。这意味着只要在转到节点sink和其他节点之间存在选项,您就应该转到另一个节点并仅在没有其他选项时使用sink节点(不完全正确但更简单) )。通过这种方式,您可以确保最终获得正确的路径。