图分支分解

时间:2014-09-30 14:29:30

标签: graph

enter image description here 你好,

我想知道一种算法,用以下列方式将图分解成具有等级的分支:

Rank | path (or tree branch)
0      1-2
1      2-3-4-5-6
1      2-7
2      7-8
2      7-9

节点1将是根节点,节点6,8和9将是端节点。 分支的等级应该由直到根节点的分叉节点的数量给出。让我们假设图表没有循环(但我希望没有这样的约束)

我是电气工程师,也许这是一个非常标准的问题,但到目前为止我只找到了BFS算法来获取路径,以及所有剪切集的东西。我也不知道this是否适用。

我希望我的问题足够明确。

PS:这个问题应该在堆栈溢出吗?

1 个答案:

答案 0 :(得分:2)

从你的例子中,我做了一些假设:

  • 只要节点的度数> 1,您就想分叉。 2
  • 您的输入图表是非循环的

使用增强的BFS,可以从根r进行。以下将生成comp_groups,它将是一个组件列表(每个组件都是其成员顶点的列表)。每个组件的排名将位于列表rank中的相同索引下。

comp[1..n] = -1           // init all vertices to belong to no components
comp[r] = 0               // r is part of component 0
comp_groups = [[r]]       // a list of lists, with the start of component 0
rank[0] = 0               // component 0 (contains root) has rank 0 
next_comp_id = 1

queue = {r}               // queues for BFS
next_queue = {}

while !queue.empty()
  for v in queue
     for u in neighbors(v)
        if comp[u] == -1                       // test if u is unvisited
          if degree(v) > 2
            comp[u] = next_comp_id             // start a new component
            next_comp_id += 1
            rank[comp[u]] = rank[comp[v]] + 1  // new comp's rank is +1
            comp_groups[comp[u]] += [v]        // add v to the new component
          else
            comp[u] = comp[v]                  // use same component
          comp_group[comp[u]] += [u]           // add u to the component
          next_queue += {u}                    // add u to next frontier
  queue = next_queue                     // move on to next frontier
  next_queue = {}