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

时间:2014-04-02 14:33:59

标签: 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}];

在上面使用它形成如下结构的图形。

enter image description here

我的问题是我不知道起点,我必须找到从任何节点到达6的所有可能路径

与上图相似,达到6的不同路径是

输出:

    [4 ->6]
    [3->4 ->6]
    [5->4 ->6]
    [2->5->4 ->6]
    [2->3->4 ->6]

我曾尝试使用回溯来写下algo,这种方式很好但是找了一些最好的算法来寻找。请建议任何其他可能的方法,以及如何优化以下程序。

// 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]]

1 个答案:

答案 0 :(得分:1)

  

我曾尝试使用回溯功能,但工作正常但寻找最好的算法才能找到。

我称之为Depth-First-Search而不是backtracking,但是算法很好。

但是,我对实施有一些建议:

  • diffPath作为本地变量,return函数
  • init
  • 如果省略if(sourceId.length === 0)条件,那么您将获得预期的输出,而不仅仅是来自源的路径
  • 而不是循环遍历pathDirection函数中的整个getAllSource,我会使用在开始遍历之前填充的查找表
  • init重命名为更有意义的内容