簡體   English   中英

三色圖算法和常數

[英]Tricolor graph algorithm and constness

為了進行拓撲排序,我需要在圖形上應用三色算法[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

我通過在構造過程中為圖中的每個節點指定一個ID來解決了這個問題。 然后,在對圖形進行排序時,我使用了一個臨時數組。 復雜:

  • 構造過程中的兩個附加操作(檢索節點計數並分配ID)。 恆定的時間。
  • 一種數組查找,以獲取頂點顏色。 恆定時間

因此沒有額外的復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM