旅行门票问题

时间:2010-06-23 12:06:45

标签: algorithm language-agnostic sorting

  

您将获得一系列各种交通工具的旅行机票,这些机票将通过途中的几个站点将您从A点带到B点。所有的门票都没有故障,你不知道你的旅程从哪里开始,也不知道它的结束地点。按正确的顺序对门票进行排序以完成您的旅程。

tickets = [
  {from: "Barcelona", to: "New York"}
  {from: "Barcelona", to: "Gerona"},
  {from: "Madrid",    to: "Barcelona"},
  {from: "Gerona",    to: "Barcelona"}
]

我想,正确的顺序就是那个:

tickets = [
  {from: "Madrid",    to: "Barcelona"},
  {from: "Barcelona", to: "Gerona"},
  {from: "Gerona",    to: "Barcelona"},
  {from: "Barcelona", to: "New York"}
]

因为没有去往马德里的门票,也没有来自纽约的门票。

该任务的最佳算法是什么?

语言是JavaScript,但与语言无关的解决方案就足够了。

  

更新:我更改了示例数据,不与One-way flight trip problem混淆。

6 个答案:

答案 0 :(得分:8)

如果您可以多次访问某个节点(城市),则为eulerian path problem

Here是解决它的两种简单算法,具体取决于您拥有的图表类型。您有第3页here的递归实现。

答案 1 :(得分:1)

这不仅仅是一个双重链接列表吗?将每个项目添加到列表中,并根据需要链接每个项目;当你完成后,你将有两个带有未连接链接的条目(一个没有连接到它的'“from”节点,一个没有连接到它的'“to”节点。这些是它们的起点和终点。链条,你从缺少“from”链接的条目开始,然后按照从一个条目到下一个条目的链接,按顺序读出它们。

答案 2 :(得分:1)

  1. 从门票中创建有向图。
  2. 找到具有indegree 0的节点
  3. 通过图形边缘迭代所有节点以创建结果
  4. 更新:通过原始帖子中添加的信息,此解决方案无法解决正确的问题。相反,请查看IVLad的response

答案 3 :(得分:1)

你得到的是有向图,你希望在其中找到Eulerian Path。链接的文章描述了找到一个的算法,基本上是:

  1. 找一个路线少于外出的城市(如果没有,从任何地方开始)
  2. 通过票证(边缘)旅行,如果不存在则不会使图表断开;除非不存在此类票证,否则使用该票证。
  3. 删除票证(边缘)并重复
  4. 您最终应该使用所有门票,并在最终目的地。

答案 4 :(得分:0)

以下是javascript实现的示例。

var un  =
[
 { from:'c',to:'d'},
 { from:'a',to:'b'},
 { from:'b',to:'c'},
 { from:'z',to:'a'},
 { from:'d',to:'m'},
]

function buildTable( un ){
return un.reduce(function(previousValue, currentValue, currentIndex ){

//build the table.
    previousValue.from[currentValue['from']] = currentValue;
    previousValue.to[currentValue['to']] = currentValue;

//to find start and end.    
    if( !previousValue.from[currentValue['to']] )  previousValue.from[currentValue['to']]= false;
    if(!previousValue.to[currentValue['from']])  previousValue.to[currentValue['from']]= false;

    return previousValue;

},{to:{},from:{}} );


}

function getStart(nodes){
//find start node indx.
    for(var i  in nodes)
    if( !nodes[i] )return i;
}


function print(start,nodes ){


var sorted = [];
//while detecting false from buildTable structure.
    while(start){
        var  node = nodes[start];
        sorted.push(node)
        start = node['to'];
//console.log(start)
    }

return sorted;
}

var sorted = buildTable(un);
console.log(print(getStart(sorted.to),sorted.from));

答案 5 :(得分:-1)

    function fullPath(path) {
    let startingPoints = [];
    let endingPoints = [];
    let result = [];

    for (let i = 0; i < path.length; i++) {
        startingPoints.push(path[i].from);
        endingPoints.push(path[i].to);
    }

    for (let i = 0; i < path.length; i++) {
        if (!endingPoints.includes(path[i].from)) {
            result.push(path[i].from);
            break;
        }
    }

    for (let i = 0; i < path.length; i++) {
        if (startingPoints.includes(result[i])) {
            let indexOfPoint = startingPoints.indexOf(result[i]);
            result.push(endingPoints[indexOfPoint]);
        }
    }
    return result;

}