c++ - 使用 Boost Graph Library 按拓扑顺序打印顶点名称

标签 c++ boost graph

我正在尝试使用 Boost 图形库。我想为我的图表打印出拓扑排序。然而,我想要在图表上输出的是顶点的实际名称,而不是数字位置。例如,在下面的例子中:

typedef boost::adjacency_list<vecS, vecS, directedS,
                              property<vertex_name_t, std::string>,
                              property<edge_weight_t, int> > Graph;

typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
typedef std::vector< Vertex > container;
Graph g;
BOOST_CHECK(read_graphviz(in, g, dp, "id"));
container c;
topological_sort(g, std::back_inserter(c));

std::cout << "A topological ordering: ";
for ( container::reverse_iterator ii=c.rbegin(); ii!=c.rend(); ++ii)
    std::cout <<*ii<<" ";                                               
std:: cout <<std::endl;

我得到以下输出:

A topological ordering: 45 40 41 34 35 33 43 30 31 36 32 26 27 25 23 24 19 46 47 18 48 17 20 21 49 50 16 51 15 44 14 22 42 13 37 38 9 11 28 29 12 7 39 6 8 5 10 3 4 0 2 1 

这些值是有序顶点的位置,但我更希望知道每个顶点的名称。有谁知道如何做到这一点?

最佳答案

我一直觉得在使用 BGL 时使用自定义 Node/Edge 类更容易:

struct Node {
    int x;
    int y;
    std::string name;
};

struct Edge {
    int weight;
};

//boost:: qualifiers removed for brevity
typedef adjacency_list<vecS, vecS, directedS, Node, Edge> Graph;

...
{
    Graph g;
    Graph::vertex_descriptor v = ...;

    g[v].x = 1;
    std::cout << g[v].name << std::endl;
}

但是是的,因为 *ii 是顶点描述符,您应该能够按照@Tom Sirgedas 提到的方式使用它。 (谁在我写我的时候发布了他的答案)

关于c++ - 使用 Boost Graph Library 按拓扑顺序打印顶点名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409869/

相关文章:

c++ - 修复 linux 中缺少的 boost 共享库

python - 在预定义的图形对象上使用 tf.train.Saver 对象

database - 寻找图形数据库

c++ - 嵌套类的原始指针类成员无法返回分配的指向对象的数据

C++ 寻找流数据的最大值

c++ - 允许用户通过在 C++ 中加倍来传递分隔符

c++ - 需要替换模板<class Stepper>

c++ - 为什么以及何时需要使用#pragma

c++ - boost 无序集不起作用

c++ - 生成多维数组而不是 cout