我有一个问题需要我在Boost图库中找到一个有向图的最小生成树。
我的第一个尝试是使用深度优先搜索和dfs-visitor。我的计划是忽略除树边回调之外的所有边。这不起作用,我给出了下面的例子来说明原因。
我的问题是我是否可以让我的dfs-visitor在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,那么它就是树边。
那么,在BGL中是否有一个简单的解决方案,或者我必须为它实现BGL中的其中一个算法?
你们所处理的问题是,你们可能已经知道,像我们处理有向图一样,寻找一个最小权的生成树状图。树状图是具有指定的根顶点R
的图,使得所有其他顶点都可以从R
到达,即存在从R
到图中所有其他顶点的路径。
不幸的是,Boost图库中没有解决这个问题的算法,所以您需要使用像这样的第三方实现或者自己实现。上面给出的实现(由atofigh在github.com上)使用了Edmond的算法,这是一种流行的求解生成树形问题的算法。
请记住,像Kruskal算法或Prim算法这样的算法对有向图不起作用,因为割性质对有向图不起作用。
考虑一个有n个顶点和m条边的无向图。假设边有两种类型:m1红色边和m2绿色边。因此m=m1+m2。红色边缘的权重为1,绿色边缘的权重为2。设计并分析了一种计算这种图的最小生成树的有效算法
假设我选择V(H)={a,e,f}和e(H)={ae,af,fe} 现在,对于每条边e∈e(H),我们用e'记下了(来自原始图G的) 达到这个最小值的边。所以E'={bc,df,eg},因为bc=4,df=9,eg=8,是连接我的元件的最小边。我在H中有一个相对于代价函数C′的最小生成树,而a′是这棵树的边集。 但是我的A'的边和E'的没有一条是一样的。
无向图最小生成树的Prim算法 思路说明 假设点A,B,C,D,E,F,两点之间有连线的,以及它们的距离分别是:(A-B:7);(A-D:5);(B-C:8);(B-D:9);(B-E:7);(C-E:5);(D-E:15);(D-F:6);(E-F:8);(E-G:9);(F-G:11) 关于Prim算法的计算过程,参与维基百科的词条:普里姆算法 将上述点与点关系以及两点之间距离(边长,有的文献
最小生成树的Kruskal算法 描述:有A、B、C、D四个点,每两个点之间的距离(无方向)是(第一个数字是两点之间距离,后面两个字母代表两个点):(1,’A’,’B’),(5,’A’,’C’),(3,’A’,’D’),(4,’B’,’C’),(2,’B’,’D’),(1,’C’,’D’) 生成边长和最小的树,也就是找出一种连接方法,将各点连接起来,并且各点之间的距离和最小。 思路说明: Krusk
我正在尝试找到一种有效的方法来检测给定的图形 G 是否具有两个不同的最小生成树。我还在尝试找到一种方法来检查它是否有 3 个不同的最小生成树。我所讨论的天真解决方案是运行一次 Kruskal 的算法并找到最小生成树的总权重。稍后,从图中删除一条边并再次运行 Kruskal 算法,并检查新树的权重是否是原始最小生成树的权重,以及图中的每个边的权重。运行时为 O(|五||E|log|V|)这根本不好,
最小生成树英文是Minimum Spanning Tree,对于最小生成树大家应该都不陌生,当然还有最大生成树,首先就简单总结一下算法里的生成树。 一、什么是生成树? Spanning有跨越的意思,生成树一般来说每个节点都能访问到别的节点,是一个连通树。所以,一般考虑无向图里去造生成树。生成树又分最小和最大两种,其中最小生成树应用比较多。总结一下生成树的定义: 1. 首先它得是一个树的结构 2.