有向树(igraph)中从一个节点到另一个节点的所有可能路径

Posted

技术标签:

【中文标题】有向树(igraph)中从一个节点到另一个节点的所有可能路径【英文标题】:All possible paths from one node to another in a directed tree (igraph) 【发布时间】:2011-04-27 16:16:15 【问题描述】:

我使用python binding 到igraph 来表示有向树。我想找到从该图中的一个节点到另一个节点的所有可能路径。不幸的是,我在 igraph 中找不到执行此任务的现成函数?

编辑

对无限多路径的关注

我所说的图实际上是一个有向无环图 (DAG),它只有一个根。它表示事件的单向级联,在级联的各个级别上,可以拆分或合并在一起。正如我所说,这是一个单向图。还规定该图不包含任何循环。由于这两个原因,无限的路径列表是不可能的。

我想做什么?

我的目标是找到从图顶部(根)到给定节点的所有可能路径。

【问题讨论】:

只要这两个节点都可以到达另一个节点,您可以通过在到达目标节点之前反复遍历一条边来构建无限多条路径。因此,所有可能路径的非终止列表不太可能对您有多大好处。您真正想要找到什么,为什么? @Jeremy W. Sherman,我不得不提一下,我正在谈论的图表实际上是一棵树。查看我的编辑以澄清情况 【参考方案1】:

您正在有向无环图 (DAG) 中查找一个节点与另一个节点之间的所有路径。

树总是 DAG,但 DAG 并不总是树。不同的是,树的分支不能加入,只能分裂,而有向无环图的分支可以一起流动,只要不引入环即可。

您的解决方案可以在"Python Patterns - Implementing Graphs." 中以find_all_paths() 的形式找到。这需要稍作调整才能与igraph 一起使用。我没有安装 igraph,但使用模拟,这似乎工作:

def adjlist_find_paths(a, n, m, path=[]):
  "Find paths from node index n to m using adjacency list a."
  path = path + [n]
  if n == m:
    return [path]
  paths = []
  for child in a[n]:
    if child not in path:
      child_paths = adjlist_find_paths(a, child, m, path)
      for child_path in child_paths:
        paths.append(child_path)
  return paths

def paths_from_to(graph, source, dest):
  "Find paths in graph from vertex source to vertex dest."
  a = graph.get_adjlist()
  n = source.index
  m = dest.index
  return adjlist_find_paths(a, n, m)

从文档中不清楚 adjlist 是顶点索引列表列表还是顶点对象列表列表。我假设列表包含索引以简化使用 adjlist。因此,返回的路径是根据顶点索引。如果您需要它们,则必须将它们映射回顶点对象,或者调整代码以附加顶点而不是其索引。

【讨论】:

+1 这很好,我唯一要改变的是使用图形本身而不是adjlist_find_paths 中的邻接列表表示。然后a[n] 可以替换为graph.successors(n),这给了你同样的东西,但避免了为一个潜在的大图提前构建邻接表。 (免责声明:我是应该为 igraph 受到指责的人之一)

以上是关于有向树(igraph)中从一个节点到另一个节点的所有可能路径的主要内容,如果未能解决你的问题,请参考以下文章

使用igraph,网络或其他R包计算有向无环图的所有生成树

N诺刷题C++

Codeforces 22E(图论)

IGraph:直到停止节点/顶点的网络距离

Is It A Tree?——简单并查集应用

BUPT复试专题—统计节点个数(2013)