如何找到有向无环图的根

时间:2014-05-21 03:45:38

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

我需要一种方法来查找有向无环图的根。我使用布尔邻接matix来表示java中的图。所以请建议。图也是未加权图

3 个答案:

答案 0 :(得分:8)

找到indegree为0的节点。为了使下面的算法工作,我们假设图中没有任何节点被隔离。

int indegree[N]={0};

for(i=0;i<n;++i){
  for(j=0;j<n;++j){
      if(graph[i][j]==1){ //assuming edge from i to j
           indegree[j]++;
      }
  }
}
for(int i=0;i<n;++i){
   if(indegree[i]==0) add i to roots;
}

答案 1 :(得分:2)

您正在寻找没有边缘的节点。如果邻接矩阵被编码使得条目(i,j)包含1,当且仅当存在从i到j的边缘时,那么对于节点K是根,则必须没有形式的边缘i-&gt; ; K,因此表格(i,K)的条目中没有1。所以你正在寻找全部为零的列K.每个这样的列都是根。

在伪代码中,

roots = {}
for k in 1 to N
  for i in 1 to N
    if adjacencies[i, k] > 0
      continue with next k value
  add k to roots

答案 2 :(得分:1)

可以在线性时间内完成。它基本上在图表上进行DFS,所有边缘都反转。

  • 选取给定图表 G
  • 中的任何顶点
  • 检查顶点 in-degree 是否等于 0 。如果确实如此,我们找到了一个顶点,它是图的根。
  • 如果没有,则将当前顶点 v 标记为已访问,并对所有未访问的 v 父项重复相同的过程。

这将获取所有必需的顶点,其中in-degree等于零或DAG的根。