【发布时间】:2015-12-24 13:53:10
【问题描述】:
对于我的 C++ 程序,我需要使用 Boost Graph 读入一个 DOT 文件,然后输出另一个 DOT 文件。但是,我在读入阶段遇到了一个奇怪的错误,这真的把我的程序搞砸了。
我读入的代码(图类型是双向Boost图的typedef)
void readGraph(Graph& graph, string filename) {
boost::dynamic_properties dp(boost::ignore_other_properties);
ifstream fin(filename.c_str());
boost::read_graphviz(fin, graph, dp);
}
好的,那么问题是.DOT文件中的节点被读取顺序错误!我尝试了一个简单的示例 .DOT 文件:
digraph G {
0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10;
0->1; 1->0;
1->2; 2->1;
2->3; 3->2;
3->4; 4->3;
4->5; 5->4;
5->6; 6->5;
6->7; 7->6;
7->8; 8->7;
8->9; 9->8;
9->10; 10->9;
}
这是一个从节点 0 到节点 10 的双向链。但是,如果我使用 Boost Graph 读取此文件并立即输出而不做任何更改,它将变为:
digraph G {
0;
1;
2;
3;
4;
5;
6;
7;
8;
9;
10;
0->1 ;
1->3 ;
3->4 ;
4->5 ;
5->6 ;
6->7 ;
7->8 ;
8->9 ;
9->10 ;
10->2 ;
1->0 ;
3->1 ;
4->3 ;
5->4 ;
6->5 ;
7->6 ;
8->7 ;
9->8 ;
10->9 ;
2->10 ;
}
注意,节点 2 现在莫名其妙地连接到节点 10,并且位于链的末端。我在读取和输出图表之间什么也没做。
注意事项:
当我尝试使用更复杂的 .DOT 文件时,图形的拓扑保持不变,只是节点由于某种奇怪的原因被置换了。
我知道这是读取错误,而不是写入错误,因为当我在程序中输出顶点和边时,它们已经搞砸了。
谁能帮我理解和解决这个问题?谢谢。
【问题讨论】: