包含/排除某些边的Boost最小生成树

包含/排除某些边的Boost最小生成树,boost,graph,boost-graph,minimum-spanning-tree,kruskals-algorithm,Boost,Graph,Boost Graph,Minimum Spanning Tree,Kruskals Algorithm,我试图实现图中所有可能的生成树的列表,以增加成本。我在用这个算法。图形初始化如下所示: typedef property<edge_weight_t, int> EdgeWeightProperty; typedef adjacency_list<vecS, vecS, undirectedS, no_property, EdgeWeightProperty> Graph; typedef Graph::edge_descriptor Edge; typedef Grap

我试图实现图中所有可能的生成树的列表,以增加成本。我在用这个算法。图形初始化如下所示:

typedef property<edge_weight_t, int> EdgeWeightProperty;
typedef adjacency_list<vecS, vecS, undirectedS, no_property, EdgeWeightProperty> Graph;
typedef Graph::edge_descriptor Edge;
typedef Graph::vertex_descriptor Vertex;
typedef boost::graph_traits<Graph>::edge_iterator EdgeIterator;
typedef std::pair<EdgeIterator, EdgeIterator> EdgePair;
Graph g;

add_edge(1, 2, 3, g);
add_edge(1, 3, 1, g);
add_edge(1, 4, 2, g);
add_edge(2, 3, 3, g);
add_edge(2, 4, 1, g);
typedef属性edgewightProperty;
typedef邻接列表图;
typedef图形::边\描述符边;
typedef图::顶点\描述符顶点;
typedef boost::graph_traits::edge_迭代器EdgeIterator;
typedef std::对边pair;
图g;
添加_边(1,2,3,g);
添加_边(1,3,1,g);
添加_边(1,4,2,g);
添加_边(2,3,3,g);
添加_边(2,4,1,g);
在这之后,有必要找到一个有一些限制的图的最小生成树,例如边(2)-(4)不应该在MST中,边(1)-(2)应该在那里

对于边排除,可以使用remove_edge_if(..)从图形中删除边

template<typename WMap>
class Remover
{
public:
    Remover(const WMap& weights, int threshold)
        : m_weights(weights), m_threshold(threshold) {}

    template<typename ED>
    bool operator()(ED w) const { return m_weights[w] <= m_threshold; }

private:
    const WMap& m_weights;
    int         m_threshold;
};

....
// remove edges of weight < 1
Remover< property_map<Graph, edge_weight_t>::type> r(get(edge_weight, g), 1);
remove_edge_if(r, g);
....
std::list < Edge > spanning_treeT;
kruskal_minimum_spanning_tree(g, std::back_inserter(spanning_treeT));
模板
类删除器
{
公众:
移除器(常量WMap和权重,整数阈值)
:m_权重(权重),m_阈值(阈值){}
模板
bool操作符()(ED w)const{return m_-weights[w]r(get(edge_-weight,g),1);
如果(r,g),则移除边缘;
....
标准::列表<边缘>跨越树;
kruskal_最小生成树(g,std::back_插入器(生成树));
但如何确保其中一条边始终在生成树中?我只是想在Kruskal函数的输出中添加一些边,但显然没有效果。它会生成图的MST+添加的边:

std::list < Edge > spanning_tree_g2;
Vertex u, v;
EdgePair ep = edges(g2);
u = source(*ep.first, g2);
v = target(*ep.first, g2);
Edge ed = edge(u, v, g2).first;
spanning_tree_g2.push_front(ed);
kruskal_minimum_spanning_tree(g2, std::back_inserter(spanning_tree_g2));
std::list生成树;
顶点u,v;
EdgePair ep=边缘(g2);
u=源(*ep.first,g2);
v=目标(*ep.first,g2);
边ed=边(u、v、g2)。首先;
生成树g2.向前推(ed);
kruskal_最小生成树(g2,std::back_插入器(生成树_g2));

是否有可能用Kraskar算法知道包含什么和不去做什么来标记边?我似乎可以通过分割这个边并在中间插入两个“人工”顶点来强制包含某个边。

MST算法已经需要生成覆盖所有顶点的边树

由于人工顶点是您故意添加的,因此很容易确保使用任何其他边都无法到达

之前:

   ------------------[e:w1+w2]------------------
之后:

   ----[e1:w1]---(v1)---[em:0]---(v2)---[e2:w2]----
(其中插入的顶点为
v1
v2

事实上,您将
(e1,em,e2)
(e2,em,e1)
的任何序列“折叠”为
(e)


你可能会得到一个到达v1和v2的树,但它永远不会穿过
em
。在这种情况下,你可以简单地删除
e1
e2
中的一个,然后无条件地将其替换为
e

我觉得你可以通过拆分此边并插入两个“人工”来强制包含某条边顶点在中间。

MST算法已经需要生成覆盖所有顶点的边树

由于人工顶点是您故意添加的,因此很容易确保使用任何其他边都无法到达

之前:

   ------------------[e:w1+w2]------------------
之后:

   ----[e1:w1]---(v1)---[em:0]---(v2)---[e2:w2]----
(其中插入的顶点为
v1
v2

事实上,您将
(e1,em,e2)
(e2,em,e1)
的任何序列“折叠”为
(e)

您可能会得到一个到达v1和v2的树,但它永远不会遍历
em
。在这种情况下,您只需删除
e1
e2
中的一个,然后无条件地将其替换为
e