你好,
我想知道一种算法,用以下列方式将图分解成具有等级的分支:
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:这个问题应该在堆栈溢出吗?
答案 0 :(得分: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 = {}