boost::read_graphviz()
和boost::read_graphml()
,分别用于GraphViz和GraphML格式。现在,它们都可以通用地读取任何类型的
boost::adjacency_list<...>
,因为它们是可变图概念的模型:#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<...>
中呢?这在这个SO帖子中有所解释(图可能非常大)。
我不理解的是,为了复制,(复制目标)图形 显然 也必须是可变图形,那么我们如何将其复制到邻接矩阵中?而不是读取到其中一个中呢?
感谢任何帮助!
注意
boost/graph/graphml.hpp
库不是头文件,并且需要链接,例如通过在编译/链接时直接从CLI附加-lboost_graph
来链接。
g++ -lboost_graph my_file.cc