三色图算法和常数

Posted

技术标签:

【中文标题】三色图算法和常数【英文标题】:Tricolor graph algorithm and constness 【发布时间】:2016-06-16 07:26:29 【问题描述】:

为了进行拓扑排序,我需要在图上应用三色算法[1]。也就是说,假设顶点是白色的,算法将被实现为

void visit(Vertex& v)
    
    v.color=GRAY;
    auto child=v.children.begin();
    auto v_end=v.children.end();
    while(child!=v_end)
        
        if(child->color==GRAY)
            throw "Loop detected";
        if(child->color==WHITE)
            visit(*child);
        ++child;
        
    v.color=BLACK;
    

现在,我希望算法不修改v,所以它可以是const 而没有mutable。使这项工作最有效的方法是什么?有些想法是

在处理之前复制图表 使用std::map<Vertex*,color_type> 在前面的传递过程中为每个顶点指定一个 id,这样的 id 对应于访问顶点的顺序。然后可以将颜色存储在数组中。

[1]http://www.cs.cornell.edu/courses/cs2112/2012sp/lectures/lec24/lec24-12sp.html

【问题讨论】:

您想修改和不修改 - 两者兼而有之? 我想在不修改v的情况下跟踪三个状态@ 【参考方案1】:

我通过在构建过程中给图中的每个节点一个 id 来解决这个问题。然后,我在对图表进行排序时使用了一个临时数组。复杂性:

构建期间的两个附加操作(检索节点计数和分配 ID)。恒定时间。 为了获得顶点颜色而进行一次数组查找。恒定时间

因此没有额外的复杂性。

【讨论】:

以上是关于三色图算法和常数的主要内容,如果未能解决你的问题,请参考以下文章

三色算法和SATB算法

算法分析之三色旗算法

S0.2 灰度图

编程之法:面试和算法心得(荷兰国旗)

经典算法-三色旗

算法--三色排序练习题