复制图表的一部分

时间:2015-03-08 08:00:19

标签: algorithm graph

我有一个图形数据结构,我需要复制它的一部分。每个节点最多有两个子节点,为了这个问题,可以假设这样表示:

struct node {
    int type;
    struct node *child1, *child2;
};

类型字段指示(仅限于叶子)是否必须复制节点,不得复制或复制节点。

我获得了一个根节点,需要返回该节点可以访问的子图的副本。必须复制某些叶节点,并且必须与原始图共享某些叶节点。由于原始图形不得损坏,因此必须复制非叶子节点(如果其任何子节点必须)。显然,我宁愿只复制那些必须复制的节点以满足要求,尽管通过复制所有非叶子节点可以满足要求。

仅复制最小集合对于树来说是微不足道的,但此图表可能包含循环。是否有一种有效的算法只复制所需的节点?特别是,一个不需要计算所有父指针或迭代直到找到一个固定点?

1 个答案:

答案 0 :(得分:1)

您可以稍微修改Tarjan's SCC algorithm以检测每个强连接组件是否需要副本。伪代码执行行

strongconnect(w)
v.lowlink := min(v.lowlink, w.lowlink)

对于深度优先搜索的每个树边vw,您可以添加

v.needscopy := v.needscopy or w.needscopy

当需要将组件从堆栈中弹出时,needscopy字段对SCC根是准确的。堆栈实际上是构造一些父指针,但也许你会更容易接受。