【发布时间】:2016-10-16 14:55:11
【问题描述】:
我有一个问题需要我在 Boost Graph Library 中找到有向图的最小生成树。
我的第一次尝试是使用深度优先搜索和 DFS-visitor。我的计划是忽略除树边缘回调之外的所有边缘。这不起作用,我在下面给出一个例子说明原因。
我的问题是我是否可以让我的 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;
}
这是失败的示例。如果我有以下有向图
digraph G {
0;
1;
1->0 ;
}
深度优先搜索dfs-visitor,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 到 a 的非树边 (u,v) 搜索树中的后代 v。
那么,BGL 中是否有一个简单的解决方案,还是我必须为此在 BGL 中实现其中一种算法?
【问题讨论】:
标签: algorithm boost graph tree boost-graph