Boost Graph Library C ++ / Степенное право

У меня есть вектор вершины с идентификатором, х & y координаты, я хочу создать степенной граф для моих вершин. График Boost Library обеспечивает степенной закон plod_iterator () но как я могу создать это с моими вершинами. кто-нибудь может помочь?

0

Решение

В документации Boost говорится, что это генераторы.

«Этот шаблон класса реализует генератор для безмасштабных графиков с использованием алгоритма Power Law Out Degree (PLOD)» (http://www.boost.org/doc/libs/1_55_0/libs/graph/doc/plod_generator.html)

Это немного сбивает с толку, что говорит итератор.

Вместо этого я бы создал вектор структур с вашими данными, а затем сгенерировал бы степенной граф с тем же числом узлов.

Изменено в буст-документации:

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/plod_generator.hpp>
#include <boost/random/linear_congruential.hpp>

struct VertData{
size_t id;
size_t x;
size_t y;
};

typedef boost::adjacency_list<> Graph;
typedef boost::plod_iterator<boost::minstd_rand, Graph> SFGen;

int main()
{

vector<VertData> vertData;
//... Initialize with data ...boost::minstd_rand gen;
// Create graph with 100 nodes
Graph g(SFGen(gen, 100, 2.5, 1000), SFGen(), 100);typedef property_map<Graph, vertex_index_t >::type VertexIndexMap;
VertexIndexMap iMap = get(vertex_index,g);
// ... get some vertex v
size_t vertexIndex = iMap[v];
//...
vertexData.at(vertexIndex).x = 4;//or what everreturn 0;
}

Здесь это будет набор безмасштабного графа с 100 узлами, используя степенной показатель 2,5.

Затем, когда вы хотите получить доступ к данным узла, просто получите доступ к его индексу и посмотрите в своем структурном векторе. Вы можете получить индекс как это:

typedef property_map<Graph, vertex_index_t >::type VertexIndexMap;
VertexIndexMap iMap = get(vertex_index,g);
size_t vertexIndex = iMap[v];
...
vertexData.at(vertexIndex).x = 4;//or what ever

Возможно, это не самый лучший способ, но он позволил мне выполнить свою работу.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]