gpt4 book ai didi

c++ - 我可以让 boost::write_graphviz 只写边吗?

转载 作者:太空狗 更新时间:2023-10-29 20:40:11 25 4
gpt4 key购买 nike

我试图让 BGL 输出一个只有边的文件,因为我正在做一个最大连通分量并且我不想删除顶点但如果没有边我也不想绘制它们.

我现在的点文件是:

graph G {
0;
1;
2;
3;
4;
5;
6;
7;
8;
9;
10;
11;
12;
0--1 [label="-3"];
0--5 [label="-2"];
2--3 [label="-8"];
3--8 [label="-4"];
4--5 [label="-1"];
4--6 [label="-6"];
4--7 [label="-5"];
4--8 [label="-10"];
8--9 [label="-9"];
}

然后我通过运行打印它

boost::write_graphviz(myfile, G, boost::default_writer(), make_edge_writer(w_map));

make_edge_writer(w_map) 确保我打印出权重(忽略负号,我实际上是在做最大生成树,但我的玩具示例有正边)。

现在,graphviz 绘制了我正确图形中的 9 个顶点,以及单独的顶点 {10, 11, 12)。如果我手动将我的点文件编辑为:

graph G {
0--1 [label="-3"];
0--5 [label="-2"];
2--3 [label="-8"];
3--8 [label="-4"];
4--5 [label="-1"];
4--6 [label="-6"];
4--7 [label="-5"];
4--8 [label="-10"];
8--9 [label="-9"];
}

然后运行 ​​graphviz,我得到了相同的图形减去多余的顶点!这基本上意味着 graphviz 不需要事先知道顶点,对吧?

那么,有人知道我如何让 write_graphviz 不预先写入顶点索引吗?我不想删除这些顶点,因为在实际示例中,多余的顶点可能位于图形内部,然后我的顶点编号将与我的输入不对应。

另外,这真的没什么大不了的,但它一直困扰着我,我想知道是否有人知道该怎么做。我尝试将 boost::default_writer() 更改为我自己的代码(没有做任何事情),但似乎没有任何区别。

最佳答案

三部分答案

  • 在 Graphviz 中预定义顶点很有用

你要过滤掉节点

  • 您可以调整 PropertyWriter
  • 您可以调整图形渲染器

我建议第一种(因为“表达你的意图”)或后者(因为“关注点分离”)。

在 Graphviz 中预定义顶点很有用

Graphviz 不需要预先知道顶点,除非它们需要一些非默认属性。

 0 [label="Node 0"];
1 [shape="Mrect"];

0 -- 1; // works

但是

 0 [label="Node 0"] -- 1 [shape="Mrect"]; // doesn't work

事实上

 0 [label="Node 0"];
0 -- 1 [label="oops"]; // oops

在边上设置“oops”标签,而不是 id 为 1 的顶点。


调整 PropertyWriter

你真正想做的是过滤掉相邻顶点为零的顶点,我会说。如果您坚持不这样做,您可以为 EdgePropertyWriter 传入自定义 PropertyWriter 实现。我想这对你有用

  template <class Name>
class my_vertex_writer {
public:
my_vertex_writer(Graph& g) : g_(g) {}

template <class Vertex>
void operator()(std::ostream& out, const Vertex& v) const {
// pseudo-code!
if (0 == boost::size(in_edges(v, g_)))
out << "[style=\"invis\"]";
}
private:
Graph& g_;
};

调整渲染器

您可以使用 gvpr 对输出进行后处理:

gvpr -c 'N[$.degree==0]{$.style="invis"}' test.dot | dot -Tpng > test.png

enter image description here

或者,要真正消除空间使用:

gvpr -c 'N[$.degree==0]{delete(0,$);}' test.dot | dot -Tpng > test.png

出于某种原因,我似乎需要重复这个(我确信去 gvpr documentation 的旅行可以解决这个问题):

cat test.dot | 
gvpr -c 'N[$.degree==0]{delete(0,$)}' |
gvpr -c 'N[$.degree==0]{delete(0,$)}' |
gvpr -c 'N[$.degree==0]{delete(0,$)}' |
dot -Tpng > test.png

enter image description here

关于c++ - 我可以让 boost::write_graphviz 只写边吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25152664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com