【发布时间】:2021-07-02 18:47:01
【问题描述】:
在 boost 图形库中,有两个流行的函数可以从文件中读取图形:
boost::read_graphviz() 和 boost::read_graphml(),分别代表 GraphViz 和 GraphML format。
现在两者都通称为任何类型的boost::adjacency_list<...>,因为它们是Mutable Graph 概念的模型:
#include <string>
#include <fstream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/adjacency_matrix.hpp>
#include <boost/graph/graphviz.hpp>
#include <boost/graph/graphml.hpp>
#include <boost/graph/graph_traits.hpp>
template <typename GraphType>
GraphType load(std::string filename, std::string format) {
GraphType g(0);
std::ifstream t(filename.c_str());
boost::dynamic_property dp(boost::ignore_other_properties);
if (format == "graphml")
boost::read_graphml(t, g, dp);
else
boost::read_graphviz(t, g, dp);
return g;
}
如果你要测试
load<boost::adjacency_matrix<boost::undirectedS> >("my_file.gv", "graphviz");
你可能会得到类似的东西
Assertion failed: (false), function add_vertex, file /usr/local/include/boost/graph/adjacency_matrix.hpp, line 966.
Abort trap: 6
那么我怎样才能包括读取到boost::adjacency_matrix<...> 的可能性,最好不必从中间邻接列表中复制图形,正如in this SO post 解释的那样(图形可能真的很大)。
我不明白的是,对于复制,(复制目标)图apparently 也必须是可变图,那么我们如何才能复制到邻接矩阵?而不是读合一吗?
感谢您的帮助!
注意
boost/graph/graphml.hpp 库不是仅标头,需要链接,例如在直接从 CLI 编译/链接时附加 -lboost_graph,如
g++ -lboost_graph my_file.cc
【问题讨论】:
-
“因为它们源自可变图概念”应该读作“因为它们是可变图概念的模型”,这是一个明显不同的东西。
标签: c++ boost graph adjacency-matrix boost-graph