今天我遇到了一个我无法解决的问题。
经常旅行的人会收集他所有的旅行机票。 票证只有2个属性,即“开始旅程位置”名称和“目的地名称”。从德里到纽约的例子。 在年底,旅行者将所有门票汇总在一起,并试图绘制他一年中的旅程。以可读格式打印他可能的旅行路线。他不记得他的起始位置。他可以多次访问某个地点,也可以多次往返一个地方。
最初我认为可以简单地通过制作图表来解决(票证-A到B表示有向边A-> B)并且使用来自具有indegree 0(??)的节点的简单深度优先遍历。但后来我意识到这不是解决问题的正确方法,因为它可以打印一条随机的无连接路线 请建议正确的方法继续。
答案 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
节点(不完全正确但更简单) )。通过这种方式,您可以确保最终获得正确的路径。