2011-01-30 14 views
0

私の問題は、グラフ(BGL adjacency_list)にサイクルを削除する簡単なアルゴリズムがあるので、非常に簡単なはずですか?私の最初の試みは、DFSビジターを使用して、サイクルを閉じるエッジを検出し、それを削除することでしたが、正しく実装できませんでした。BGLグラフの単純なサイクル除去アルゴリズム

提案がありますか?コードサンプルが最適です。

答えて

5

ブーストが優れています。訪問者を受け入れる方法はdepth_first_searchです。 You can see more information about it here。バックエッジがグラフ内のサイクルを閉じたエッジである当然の

class CycleTerminator : public boost::dfs_visitor<> { 
    template <class Edge, class Graph> 
    void back_edge(Edge e, Graph& g) { 
     //implement 
    } 
}; 

思い出し:

あなたがする必要があるのは、このような訪問者を実装しています。

+0

きれいでエレガントです。私はこれを受け入れますが、私はサイクルのすべてのエッジを実際に除去しなければならないことを理解しました。私は実際に質問を変えるので、それについて新しい質問を開くつもりです^^ – cdecker

0

あなたが言ったように、それは単純なDFSです。あなたが前に訪問したノードに来るたびに、サイクルがあります。最後のエッジを削除するだけです。

特定の言語の擬似コード。

void walk(current_node, previous_node) 
    if visited[current_node] 
     remove edge between current_node and previous_node 
     return 
    end 

    visited[current_node] = true 
    for (each adjacent node) 
     walk(adjacent_node, current_node) 
    end 
end 
関連する問題