三色图算法和常数
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)。恒定时间。 为了获得顶点颜色而进行一次数组查找。恒定时间因此没有额外的复杂性。
【讨论】:
以上是关于三色图算法和常数的主要内容,如果未能解决你的问题,请参考以下文章