Update : sehe provides an updated and more efficient solution here:
fooobar.com/questions/1563927 / ...
Kruskal DFS. . , , . , MST . , , .
http://en.wikipedia.org/wiki/Kruskals_algorithm.
. .
#include <iostream>
#include <vector>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/kruskal_min_spanning_tree.hpp>
using namespace std;
using namespace boost;
typedef adjacency_list < vecS, vecS, undirectedS,
property< vertex_index_t, size_t> ,
property< edge_index_t, size_t, property<edge_weight_t,double> > > Graph;
typedef graph_traits<Graph>::vertex_descriptor Vertex;
typedef graph_traits<Graph>::edge_descriptor Edge;
typedef boost::property_map< Graph, boost::vertex_index_t>::type VertexIndexMap;
typedef boost::property_map< Graph, boost::edge_weight_t>::type WeightMap;
struct MyVis:default_dfs_visitor{
MyVis(vector<string> vNames):vertNames(vNames){}
template < typename Edge, typename Graph >
void tree_edge(Edge e, const Graph& g) const {
VertexIndexMap vMap = get(boost::vertex_index,g);
cout << "Edge " << vertNames.at(vMap[source(e,g)]) << " " << vertNames.at(vMap[target(e,g)]) << endl;
}
private:
vector<string> vertNames;
};
int main(int argc, char* argv[]){
Graph G;
vector<Vertex> verts;
vector<Edge> edges;
for(size_t i = 0; i < 7; ++i){
Vertex v = add_vertex(G);
verts.push_back(v);
}
VertexIndexMap vertexIndexMap = get(boost::vertex_index, G);
vector<string> vertexNames(num_vertices(G));
boost::iterator_property_map< std::vector< string >::iterator, VertexIndexMap >
vertexNameMap(vertexNames.begin(), vertexIndexMap);
vertexNames.at(0) = "A";
vertexNames.at(1) = "B";
vertexNames.at(2) = "C";
vertexNames.at(3) = "D";
vertexNames.at(4) = "E";
vertexNames.at(5) = "F";
vertexNames.at(6) = "G";
WeightMap weightMap = get(edge_weight,G);
pair<Edge,bool> myPair = add_edge(verts.at(0),verts.at(1),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 7.0;
myPair = add_edge(verts.at(0),verts.at(3),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 5.0;
myPair = add_edge(verts.at(1),verts.at(2),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 8.0;
myPair = add_edge(verts.at(1),verts.at(3),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 9.0;
myPair = add_edge(verts.at(1),verts.at(4),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 7.0;
myPair = add_edge(verts.at(2),verts.at(4),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 5.0;
myPair = add_edge(verts.at(3),verts.at(4),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 15.0;
myPair = add_edge(verts.at(3),verts.at(5),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 6.0;
myPair = add_edge(verts.at(4),verts.at(5),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 8.0;
myPair = add_edge(verts.at(4),verts.at(6),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 9.0;
myPair = add_edge(verts.at(5),verts.at(6),G);
edges.push_back(myPair.first);
weightMap[myPair.first] = 11.0;
cout << "vertices " << num_vertices(G) << endl;
cout << "edges " << num_edges(G) << endl;
vector<Edge> spanning_tree_edges;
kruskal_minimum_spanning_tree(G, std::back_inserter(spanning_tree_edges));
cout << "num MST edges " << spanning_tree_edges.size() << endl;
Graph MST;
WeightMap mstWeightMap = get(edge_weight,MST);
vector<string> mstNames(num_vertices(G));
VertexIndexMap mstIndexMap = get(boost::vertex_index, MST);
cout << "MST Edges" << endl;
for(size_t i = 0; i < spanning_tree_edges.size(); ++i){
Edge e = spanning_tree_edges.at(i);
Vertex v1 = source(e,G);
Vertex v2 = target(e,G);
cout << "edge weight " << weightMap[e] << " v1 " << vertexNameMap[v1] << " v2 " << vertexNameMap[v2] << endl;
myPair = add_edge(v1,v2,MST);
Edge mstE = myPair.first;
mstWeightMap[mstE] = weightMap[e];
mstNames.at(mstIndexMap[v1]) = vertexNameMap[v1];
mstNames.at(mstIndexMap[v2]) = vertexNameMap[v2];
}
MyVis vis(mstNames);
cout << "DFS on MST: start node E" << endl;
boost::depth_first_search(MST, visitor(vis).root_vertex(verts.at(4)));
cout << "DFS on MST: start node B" << endl;
boost::depth_first_search(MST, visitor(vis).root_vertex(verts.at(1)));
cin.get();
}