首页 文章

旅行门票问题

提问于
浏览
9

您将获得一系列各种交通工具的旅行机票,这些机票将通过途中的几个站点从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 回答

  • 1

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

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

  • 0

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

  • 1

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

    • 找一个路线少于外出的城市(如果没有,从任何地方开始)

    • 乘坐机票(边缘),在那里赢得了_1678060吨;除非不存在此类票证,否则使用该票证 .

    • 删除票证(边缘)并重复

    您最终应该使用所有门票,并在最终目的地 .

  • 8
    • 从票证中创建有向图 .

    • 查找具有indegree 0的节点

    • 通过图形边缘迭代所有节点以创建结果

    更新:通过原始帖子中添加的信息,此解决方案无法解决正确的问题 . 而是看看IVLad的response .

  • 1

    以下是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));
    

相关问题