您将获得一系列各种交通工具的旅行机票,这些机票将通过途中的几个站点将您从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混淆。
答案 0 :(得分:8)
如果您可以多次访问某个节点(城市),则为eulerian path problem。
答案 1 :(得分:1)
这不仅仅是一个双重链接列表吗?将每个项目添加到列表中,并根据需要链接每个项目;当你完成后,你将有两个带有未连接链接的条目(一个没有连接到它的'“from”节点,一个没有连接到它的'“to”节点。这些是它们的起点和终点。链条,你从缺少“from”链接的条目开始,然后按照从一个条目到下一个条目的链接,按顺序读出它们。
答案 2 :(得分:1)
更新:通过原始帖子中添加的信息,此解决方案无法解决正确的问题。相反,请查看IVLad的response。
答案 3 :(得分:1)
你得到的是有向图,你希望在其中找到Eulerian Path。链接的文章描述了找到一个的算法,基本上是:
您最终应该使用所有门票,并在最终目的地。
答案 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;
}