2

私は最小スパニング トレ (MST) を使用しており、ブーストを使用するのは初めてです。私の問題は、1 つの重みベクトルを使用して MST を生成し、その後、別のベクトルを使用してツリーを再構築することです。多分私はコードでよりよく説明できるでしょう:

using namespace boost;
typedef adjacency_list < vecS, vecS, undirectedS, property<vertex_distance_t, int>, property < edge_weight_t, int > > Graph;
typedef graph_traits < Graph >::edge_descriptor Edge;
typedef graph_traits < Graph >::vertex_descriptor Vertex;
typedef std::pair<int, int> E;

const int num_nodes = 5;
E edges[] = { E(0, 2), E(1, 3), E(1, 4), E(2, 1), E(2, 3),
E(3, 4), E(4, 0) };
int weights[] = { 1, 1, 2, 7, 3, 1, 1 };
int weights2[] = { -1, 1, -2, 7, 3, -1, -1 };
Graph g(edges, edges + sizeof(edges) / sizeof(E), weights, num_nodes);
property_map<Graph, edge_weight_t>::type weightmap = get(edge_weight, g);

std::vector < graph_traits < Graph >::vertex_descriptor > parentMap(num_vertices(g));
property_map<Graph, vertex_distance_t>::type distancemap = get(vertex_distance, g);
property_map<Graph, vertex_index_t>::type indexmap;
prim_minimum_spanning_tree (g, *vertices(g).first, &parentMap[0], distancemap, weightmap, indexmap,  default_dijkstra_visitor());

for (std::size_t i = 0; i != parentMap.size(); ++i)
  if (parentMap[i] != i)
    std::cout << "parent[" << i << "] = " << parentMap[i] << std::endl;
  else
    std::cout << "parent[" << i << "] = no parent" << std::endl;

std::cout<<"Weights"<<std::endl;
for (std::size_t i = 0; i != parentMap.size(); ++i)
  std::cout<<"weight["<<i<<"]:  "<<  distancemap(i) <<std::endl;

return EXIT_SUCCESS;

上記のコードでは、MST を生成できます。また、parentMap と distanceMap を使用して、ツリーの各エッジの重みを取得できます。

しかし、ベクトルウェイトを使用して MST を生成し、weights2を使用して頂点間のエッジ値を取得したい場合、どうすればよいでしょうか?

4

0 に答える 0