簡體   English   中英

如何使用Boost Graph Library更改圖表中的邊緣權重?

[英]How do I change the edge weight in a graph using the Boost Graph Library?

我使用Boost圖庫定義了一個Graph,

typedef boost::property<boost::edge_weight_t, int> EdgeWeightProperty;
typedef boost::adjacency_list<boost::listS, boost::vecS,boost::undirectedS,boost::no_property,EdgeWeightProperty> Graph;

使用添加邊緣相當簡單

boost::add_edge(vertice1, vertice2, weight, graph);

我還沒有弄清楚如何設置邊緣重量。 一種可能的解決方案是刪除邊緣並使用更新的權重值重新添加它,但是,這看起來有點過分。

一種解決方案是執行以下操作

typedef boost::adjacency_list<boost::setS, boost::vecS, boost::undirectedS,boost::no_property,EdgeWeightProperty> Graph;
typedef Graph::edge_descriptor Edge;
Graph g;
std::pair<Edge, bool> ed = boost::edge(v1,v2,g);
int weight = get(boost::edge_weight_t(), g, ed.first);
int weightToAdd = 10;
boost::put(boost::edge_weight_t(), g, ed.first, weight+weightToAdd);

另一種解決方案是使用屬性映射。 這是一個例子。

// Edge weight.
typedef boost::property<boost::edge_weight_t, int> EdgeWeightProperty;

// Graph.
typedef boost::adjacency_list< boost::listS,
                               boost::vecS,
                               boost::undirectedS,
                               boost::no_property,
                               EdgeWeightProperty > Graph;

// Vertex descriptor.
typedef typename boost::graph_traits<Graph>::vertex_descriptor Vertex;

// The Graph object
Graph g;

// Populates the graph.
Vertex v1 = boost::add_vertex(g);
Vertex v2 = boost::add_vertex(g);
Vertex v3 = boost::add_vertex(g);
boost::add_edge(v1, v2, EdgeWeightProperty(2), g);
boost::add_edge(v1, v3, EdgeWeightProperty(4), g);
boost::add_edge(v2, v3, EdgeWeightProperty(5), g);

// The property map associated with the weights.
boost::property_map < Graph,
                      boost::edge_weight_t >::type EdgeWeightMap = get(boost::edge_weight, g);

// Loops over all edges and add 10 to their weight.
boost::graph_traits< Graph >::edge_iterator e_it, e_end;
for(std::tie(e_it, e_end) = boost::edges(g); e_it != e_end; ++e_it)
{
  EdgeWeightMap[*e_it] += 10;
}

// Prints the weighted edgelist.
for(std::tie(e_it, e_end) = boost::edges(g); e_it != e_end; ++e_it)
{
  std::cout << boost::source(*e_it, g) << " "
            << boost::target(*e_it, g) << " "
            << EdgeWeightMap[*e_it] << std::endl;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM