Javascript 到达有向图中特定节点的所有可能路径
我有一个有向图,其中路径存储在JSON数组中,如。它以源和目的的形式存在Javascript 到达有向图中特定节点的所有可能路径,javascript,algorithm,data-structures,graph-algorithm,directed-graph,Javascript,Algorithm,Data Structures,Graph Algorithm,Directed Graph,我有一个有向图,其中路径存储在JSON数组中,如。它以源和目的的形式存在 Var pathDirection = [{"Source":2,"Destination":3}, {"Source":3,"Destination":4}, {"Source":5,"Destination":4}, {"Source":2,"Destination":5}, {"Source":4,"Destination":6}]; 使用上面的结构,它形成了如下结构的图形 我的问题是我不知道起点,我必须找到从
Var pathDirection = [{"Source":2,"Destination":3},
{"Source":3,"Destination":4},
{"Source":5,"Destination":4},
{"Source":2,"Destination":5},
{"Source":4,"Destination":6}];
使用上面的结构,它形成了如下结构的图形
我的问题是我不知道起点,我必须找到从任何节点到达6的所有可能路径
如上图所示,不同路径可达6
输出:
[4 ->6]
[3->4 ->6]
[5->4 ->6]
[2->5->4 ->6]
[2->3->4 ->6]
我试图写下面的算法使用回溯,这是工作良好,但寻找一些最好的算法找到。请建议任何其他可能的方法来做同样的事情,我怎样才能优化下面的程序
// BackTrack From End Node Destination 6
var getAllSource = function(destId){
var sourceForsameDist = [];
pathDirection.forEach(function(eachDirection){
if(eachDirection.Destination == destId){
sourceForsameDist.push(eachDirection.Source);
}
});
return sourceForsameDist;
};
var diffPath = [];
var init = function(destination){
var sourceId = getAllSource(destination[destination.length - 1]);
if(sourceId.length === 0){
diffPath.push(destination);
}
for(var i=0;i<sourceId.length;i++){
var copy = destination.slice(0);
copy.push(sourceId[i]);
init(copy);
}
};
init([6]);
console.log(diffPath); // [[6,4,3,2],[6,4,5,2]]
//从结束节点目标6回溯
var getAllSource=函数(destId){
var sourceForsameDist=[];
forEach(函数(eachDirection){
if(eachDirection.Destination==destind){
sourceForsameDist.push(eachDirection.Source);
}
});
amedist的返回源;
};
var diffPath=[];
var init=函数(目标){
var sourceId=getAllSource(destination[destination.length-1]);
if(sourceId.length==0){
推送(目的地);
}
对于(var i=0;i
我曾经尝试过使用回溯法,虽然效果很好,但是正在寻找一些最好的算法
我会叫它代替,但是的,算法很好
但是,我有一些关于实施的建议:
- 使
diffPath
成为一个局部变量,并从init
函数返回它
- 如果省略
If(sourceId.length==0)
条件,则将获得预期的输出,而不仅仅是源路径
- 在
getAllSource
函数中,我将使用在开始遍历之前填充的查找表,而不是循环遍历整个pathDirection
s
- 将
init
重命名为更有意义的名称
只需向后搜索(就像边缘位于相反方向)从aim节点,使用DFS或BFS。图形是否可以包含圆?结果是否应该是一个infite列表?@Bergi您想说什么?对于基本问题,很抱歉。它是否是一个。您的示例是一个,我想知道每个可能的输入是否都是一个。@Bergi它永远不会是循环的,也不会循环回sam我的朋友!你的建议太棒了。