ブーストグラフライブラリで有向グラフの最小スパニングツリーを見つける必要があるという問題があります。ブーストグラフライブラリ - 指向グラフの最小スパニングツリー
私の最初の試みは、深さの最初の検索とDFSの訪問者を使用することでした。私の計画は、ツリーエッジコールバックを除くすべてのエッジを無視することでした。これはうまくいかず、なぜ私は下の例を挙げます。
私の質問は、私のdfs-visitorがBGLの有向グラフの最小スパニングツリーを作成できるかどうかです。
ここではアルゴリズムがあり、ここで説明しましたが(Finding a minimum spanning tree on a directed graph)、BGLに実装されているかどうかはわかりません。すでにBGLに入っているものを単純に変更しただけではわかりません。
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/depth_first_search.hpp>
struct my_visitor : public boost::dfs_visitor<>
{
template <class Edge, class Graph>
void back_edge(Edge e, const Graph&)
{
std::cout << "Back edge: " << e << std::endl;
}
template <class Edge, class Graph>
void forward_or_cross_edge(Edge u, const Graph& g)
{
std::cout << "Forward or cross edge: " << u << std::endl;
}
template <class Edge, class Graph>
void tree_edge(Edge u, const Graph& g)
{
std::cout << "Tree Edge: " << u << std::endl;
}
};
int main()
{
using namespace boost;
typedef boost::adjacency_list< listS, vecS, bidirectionalS > digraph;
// Construct the directed graph
digraph g(2);
add_edge(1, 0, g);
//add_edge(0, 1, g);
my_visitor vis2;
boost::depth_first_search(g, visitor(vis2));
return 0;
}
ここでは失敗する例を示します。私は深さ優先検索DFS-訪問者に以下の有向グラフ
digraph G {
0;
1;
1->0 ;
}
を持っている場合は、1-> 0は、前方エッジとして分類されます。
エッジが0 - > 1になるようにグラフを変更した場合、エッジはツリーエッジです。
DFSの前方エッジとソースコードの厳密な定義から、頂点0は頂点1の前に来るので、前方エッジです。
しかし、エッジ1-> 0は技術的意味では依然としてツリーエッジであり、そのページに与えられた定義からはhttp://www.boost.org/doc/libs/1_59_0/libs/graph/doc/graph_theory_review.htmlです。
フォワードエッジは、頂点uを検索ツリーの 子孫vに接続する非ツリーエッジ(u、v)です。
したがって、BGLには簡単な解決策がありますか、それともBGLのアルゴリズムの1つを実装する必要がありますか?