こんにちは。
Boost Graph Library + Graphviz を使い、グラフ描画してみました1 2。
$ g++ -std=c++11 -I/usr/local/include graphviz.cpp
$ ./a.out; dot -Tpdf graphviz.dot -o graphviz.pdf
graphviz.cpp
# include <boost/graph/graphviz.hpp>
# include <boost/range/adaptor/indexed.hpp>
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, int64_t, int64_t> graph_t;
int main()
{
graph_t g;
std::vector<std::array<int, 2>> edges = {{0, 1}, {0, 2}, {0, 3}, {1, 2}, {2, 1}, {3, 4}, {3, 5}};
for(auto&& it : edges | boost::adaptors::indexed()){
auto eid = it.index();
auto u = it.value()[0];
auto v = it.value()[1];
auto e = add_edge(u, v, eid, g);
ename[e.first] = std::to_string(eid);
}
std::string fname = "graphviz.dot";
std::cout << "writing " << fname << '\n';
std::ofstream file(fname);
boost::write_graphviz(file, g);
boost::write_graphviz(file, g, boost::default_writer(), make_label_writer(boost::make_assoc_property_map(ename)));
}
-
なおもしも、 このコードで、
add_edge
へ与える vertex 番号を連続させずスキップさせると、スキップされた孤立 vertex が生じます(例えばコード内の5
を6
へ置き換えると、孤立した5
が描かれます)。 ↩ -
"How to use boost make_label_writer to write edge properties?" (Stack Overflow) も参考になります。 ↩