【问题标题】:Copying part of a graph复制图表的一部分
【发布时间】:2015-03-08 22:44:28
【问题描述】:

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

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

类型字段指示(仅在叶子中)节点是必须复制、不得复制还是可以复制。

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

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

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 关于父指针,我主要关心是否需要在每个节点上存储一个可变大小的指针数组。我的使用完全可以接受您的解决方案。
    猜你喜欢
    • 2018-08-26
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2015-04-19
    • 2013-03-09
    • 2017-12-27
    • 2017-03-22
    相关资源
    最近更新 更多