您将获得一系列各种交通工具的旅行机票,这些机票将通过途中的几个站点从A点到B点 . 所有的门票都没有故障,你不知道你的旅程从哪里开始,也不知道它的结束地点 . 按正确的顺序对门票进行排序以完成您的旅程 . 门票= [
{from:“Barcelona”,to:“New York”}
{from:“Barcelona”,to:“Gerona”},
{从:“马德里”,到:“巴塞罗那”},
{from:“Gerona”,to:“Barcelona”}
]
我想,正确的顺序是:
tickets = [
{from: "Madrid", to: "Barcelona"},
{from: "Barcelona", to: "Gerona"},
{from: "Gerona", to: "Barcelona"},
{from: "Barcelona", to: "New York"}
]
因为没有去马德里的机票,也没有来自纽约的机票 .
什么是该任务的最佳算法?
该语言是JavaScript,但与语言无关的解决方案就足够了 .
更新:我更改了样本数据,以免与单程飞行问题混淆 .
5 回答
如果您可以多次访问节点(城市),则为eulerian path problem .
Here是解决它的两种简单算法,具体取决于您拥有的图形类型 . 您有第3页here的递归实现 .
这不仅仅是一个双重链接列表吗?将每个项目添加到列表中,并根据需要链接每个项目;当你完成后,你将有两个带有未连接链接的条目(一个没有连接到它的'“from”节点,一个没有连接到它的'“to”节点 . 这些是它们的起点和终点 . 通过从缺少“from”链接的条目开始,并按照从一个条目到下一个条目的链接,您可以按顺序读取它们 .
你得到的是有向图,你希望在其中找到Eulerian Path . 链接的文章描述了找到一个的算法,基本上是:
找一个路线少于外出的城市(如果没有,从任何地方开始)
乘坐机票(边缘),在那里赢得了_1678060吨;除非不存在此类票证,否则使用该票证 .
删除票证(边缘)并重复
您最终应该使用所有门票,并在最终目的地 .
从票证中创建有向图 .
查找具有indegree 0的节点
通过图形边缘迭代所有节点以创建结果
更新:通过原始帖子中添加的信息,此解决方案无法解决正确的问题 . 而是看看IVLad的response .
以下是javascript实现的示例 .