【问题标题】:All possible path to reach particular node in directed graph到达有向图中特定节点的所有可能路径
【发布时间】:2014-04-02 14:33:59
【问题描述】:

我有一个有向图,其中路径存储在 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]]

【问题讨论】:

  • 使用 DFS 或 BFS 从您的目标节点向后搜索(好像边缘在相反方向)。
  • 图形可以包含圆圈吗?那么结果应该是一个无限列表吗?
  • @Bergi 想要通过图表说什么包含圆圈?对不起,基本问题。
  • 是否是DAG。你的例子是一个,我想知道是否每个可能的输入都是一个。
  • @Bergi 它永远不会是循环的,也不会循环回到同一个节点

标签: javascript algorithm data-structures graph-algorithm directed-graph


【解决方案1】:

我尝试过使用回溯,它工作正常,但正在寻找一些最佳算法。

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

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

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

【讨论】:

  • 谢谢我的朋友!!你的建议很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多