Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 到达有向图中特定节点的所有可能路径_Javascript_Algorithm_Data Structures_Graph Algorithm_Directed Graph - Fatal编程技术网

Javascript 到达有向图中特定节点的所有可能路径

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}]; 使用上面的结构,它形成了如下结构的图形 我的问题是我不知道起点,我必须找到从

我有一个有向图,其中路径存储在JSON数组中,如。它以源和目的的形式存在

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我的朋友!你的建议太棒了。