如何使用 Boost 为图形的节点着色
how to color a node of a graph using boost
我试图使用boost创建一个图表。我想更改节点和边缘的属性。我收到编译错误。很抱歉重复的问题
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct my_graph_writer {
void operator()(std::ostream& out) const {
out << "graph [bgcolor=lightgrey]" << std::endl;
out << "node [shape=circle color=blue]" << std::endl;
out << "edge [color=red]" << std::endl;
}
} myGraphWrite;
int main()
{
using namespace boost;
typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph;
Graph g;
add_edge(0, 1, 123, g);
std::ofstream gout;
gout.open("graphname.dot");
write_graphviz(gout,g,my_graph_writer);
}
我更正如下。但是拳头节点没有改变。问题出在哪里?
#include <iostream>
#include <boost/graph/graphviz.hpp>
using namespace boost;
typedef adjacency_list< listS, vecS, directedS > digraph;
// define a property writer to color the edges as required
class color_writer {
public:
// constructor - needs reference to graph we are coloring
color_writer( digraph& g ) : myGraph( g ) {}
// functor that does the coloring
template <class VertexOrEdge>
void operator()(std::ostream& out, const VertexOrEdge& e) const {
out << "graph [bgcolor=lightgrey]" << std::endl;
out << "node [shape=Mrect color=blue]" << std::endl;
out << "edge [color=red]" << std::endl;
}
private:
digraph& myGraph;
};
int main()
{
using namespace std;
// instantiate a digraph object with 8 vertices
digraph g;
// add some edges
add_edge(0, 1, g);
add_edge(1, 5, g);
add_edge(5, 6, g);
add_edge(2, 3, g);
add_edge(2, 4, g);
boost::write_graphviz(f, g,color_writer( g ));
return 0;
}
正如你在这里看到的,具有三个参数的write_graphviz
重载期望它的第三个参数是VertexPropertyWriter
,所以你需要使用(就像你原来一样)五个参数重载。这是你的方法:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
using std::map;
struct my_node_writer {
// my_node_writer() {}
my_node_writer(Map& g_) : g (g_) {};
template <class Vertex>
void operator()(std::ostream& out, Vertex v) {
out << " [label="" << v << ""]" << std::endl;
};
Map g;
};
struct my_edge_writer {
my_edge_writer(Map& g_) : g (g_) {};
template <class Edge>
void operator()(std::ostream& out, Edge e) {
out << " [color=purple]" << std::endl;
out << " [label="" << e <<":" << g[e].miles << ""]" << std::endl;
};
Map g;
};
struct my_graph_writer {
void operator()(std::ostream& out) const {
out << "graph [bgcolor=lightgrey]" << std::endl;
out << "node [shape=circle color=blue]" << std::endl;
out << "edge [color=red]" << std::endl;
}
} myGraphWrite;
int main()
{
using namespace boost;
typedef adjacency_list<vecS, vecS, directedS, no_property, int> Graph;
Graph g;
add_edge(0, 1, 123, g);
std::ofstream gout;
gout.open("graphname.dot");
write_graphviz(gout,map,my_node_writer(map),my_edge_writer(map),myGraphWrite);
}
您有两个问题:您不能将g[e].miles
与定义的图形一起使用,并且Map
不引用任何内容。
为了解决第一个问题,您需要创建一个名为miles
的member_variable结构,并将其用作图形定义中的EdgeProperty
。解决Map
问题的最简单方法可能是在需要的地方使其成为结构的模板参数(尽管您也可以在属性编写器之前定义图形,然后使用 Graph
而不是 Map
。这是进行这些更改后的代码:
在科利鲁上运行:
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
using std::map;
template <typename Map>
struct my_node_writer {
// my_node_writer() {}
my_node_writer(Map& g_) : g (g_) {};
template <class Vertex>
void operator()(std::ostream& out, Vertex v) {
out << " [label="" << v << ""]" << std::endl;
};
Map g;
};
template <typename Map>
my_node_writer<Map> node_writer(Map& map) { return my_node_writer<Map>(map); }
template <typename Map>
struct my_edge_writer {
my_edge_writer(Map& g_) : g (g_) {};
template <class Edge>
void operator()(std::ostream& out, Edge e) {
out << " [color=purple]" << std::endl;
out << " [label="" << e <<":" << g[e].miles << ""]" << std::endl;
};
Map g;
};
template <typename Map>
my_edge_writer<Map> edge_writer(Map& map) { return my_edge_writer<Map>(map); }
struct my_graph_writer {
void operator()(std::ostream& out) const {
out << "graph [bgcolor=lightgrey]" << std::endl;
out << "node [shape=circle color=blue]" << std::endl;
out << "edge [color=red]" << std::endl;
}
} myGraphWrite;
struct edge_prop
{
int miles;
};
int main()
{
using namespace boost;
typedef adjacency_list<vecS, vecS, directedS, no_property, edge_prop> Graph;
Graph g;
add_edge(0, 1, edge_prop{123}, g);
write_graphviz(std::cout,g,node_writer(g),edge_writer(g),myGraphWrite);
}
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- Boost Graph Library,修复节点大小
- C++A*算法并不总是在路径中具有目标节点
- C++图形类指针混淆
- 如何找到2个单链表的公共节点
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 有没有办法通过 LEMON 图形库中的 Map 值获取节点?
- 制作完成后是否可以将节点添加到图形中
- 使用深度第一次搜索的无向图中的图形调查无法实现的节点
- 如何使用 Boost 为图形的节点着色
- 提升图形库:防止 DFS 访问未连接的节点
- 图形中有多少节点可访问
- 读取图形可视化的点文件,而无需在提升图中存储节点 ID
- C/C++图形库查询节点由三个部分组成
- C++ - 使用取消引用运算符重载实现图形节点的合并
- 在C++中实现图形节点时将 C# 类转换为C++
- 跟踪图形访问者中访问的节点
- 包含一个图形节点作为关键字的无序映射
- 动态连接 QML 中图形的节点 la Pd 或 Max(又名"patching"接口)