Печать имен вершин в топологическом порядке с помощью библиотеки графов ускорения - PullRequest
0 голосов
/ 05 августа 2010

Я пытаюсь использовать библиотеку графов ускорения.Я хочу распечатать топологическую сортировку для моего графика.Однако вывод, который я хочу получить на моем графике, это фактические имена вершин, а не номера позиций.Например, в следующем примере:

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 

Эти значения являются позициями упорядоченных вершин, но я бы предпочел иметь имякаждая вершина.Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

3 голосов
/ 05 августа 2010

Мне всегда было легче работать с пользовательскими классами Node / Edge при использовании BGL:

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.(Кто опубликовал свой ответ, пока я писал свой)

2 голосов
/ 05 августа 2010

Хм, это общее программирование смущает меня :) Попробуйте этот код. Должен скомпилироваться, как минимум!

std::cout << get(vertex_name, g, *ii) << " ";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...