30 Ekim 2017 Pazartesi

graph add_vertex metodu

add_vertex - parametresiz
Elimizde şöyle bir graph olsun
typedef boost::adjacency_list<boost::setS, boost::setS, boost::undirectedS, 
  uint32_t, float> Graph;
Vertex tipini tanımlamak için şöyle yaparız
typedef Graph::vertex_descriptor VertexType;
Vertex'leri eklemek için şöyle yaparız. Bu durumda her vertex'in property alanı atanmamış olur
Graph g;
VertexType v_0 = boost::add_vertex (g);
VertexType v_1 = boost::add_vertex (g);
VertexType v_2 = boost::add_vertex (g);
VertexType v_3 = boost::add_vertex (g);
Vertex'leri eklemek için şöyle yaparız. Bu durumda her vertex'in property alanı atanmış olur
VertexID v_0 = boost::add_vertex(0, g);
VertexID v_1 = boost::add_vertex(1, g);
VertexID v_2 = boost::add_vertex(2, g);
VertexID v_3 = boost::add_vertex(4, g);
add_vertex - vertex_prop ile vertex ismi
Elimizde şöyle bir graph olsun
typedef property<edge_name_t, char> edge_prop;
typedef property<vertex_name_t, char, property<vertex_index_t, int> > vertex_prop;

typedef adjacency_list<vecS, vecS, bidirectionalS, vertex_prop, edge_prop> Graph;
Vertex'leri eklemek için şöyle yaparız. Bu durumda vertex'lerin sadece char alanı atanmış, int alanı atanmamış olur.
Graph g;
VertexType v_0 = add_vertex(vertex_prop('a'),g);
VertexType v_1 = add_vertex(vertex_prop('b'),g);
add_vertex - vertex struct
Örnek
Elimizde şöyle bir graph olsun.
class VertexInfo
{
public:
    VertexInfo(int i) : id(i) {}
    int id;
};

typedef boost::adjacency_list< boost::setS,
                               boost::listS,    
                               boost::bidirectionalS,
                               VertexInfo,
                               boost::no_property,
                               boost::no_property,
                               boost::listS
                              > Graph;

typedef boost::graph_traits<Graph>::vertex_descriptor VertexType;
Vertex'leri eklemek için şöyle yaparız.
Vertex src  = boost::add_vertex(VertexInfo(0), g);
Vertex tar1 = boost::add_vertex(VertexInfo(5), g);
Vertex tar2 = boost::add_vertex(VertexInfo(2), g);
Vertex tar3 = boost::add_vertex(VertexInfo(8), g);
Örnek
Elimizde bir graph olsun
struct VertexProperty {
    int id;
};

typedef boost::adjacency_list<listS, vecS, undirectedS, VertexProperty> Graph;
stream'den okuyarak graph'a eklemek için şöyle yaparız.
std::istringstream iss(line);
if (iss >> e1 >> e2) {
  // find or insert v1 and v2, e.g. insert by:
  auto v1 = add_vertex(VertexProperty { e1 }, g);
  auto v2 = add_vertex(VertexProperty { e2 }, g);

  add_edge(v1, v2, g);
}
Örnek
Aynı vertex'in iki kere eklenmediğini kontrol etmek için şöyle yaparız.
struct MyVertex {
  std::string label;
  int id;

  auto key() const { return std::tie(id,label); }
  bool operator< (const MyVertex &rhs) const { return key() <  rhs.key(); }
  bool operator==(const MyVertex &rhs) const { return key() == rhs.key(); }
  bool operator!=(const MyVertex &rhs) const { return key() != rhs.key(); }
};

using graph_t=boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, MyVertex>;


graph_t graph;

auto node = [&graph](std::string name, int id) {
  for (auto&& v : boost::make_iterator_range(vertices(graph)))
    if (graph[v] == MyVertex{name, id})
      eturn v;
    return add_vertex({name, id}, graph);
};

auto v1 = node("Lorem", 123);
auto v2 = node("ipsum", 456);
auto v3 = node("Lorem", 123);

assert(v3==v1);


Hiç yorum yok:

Yorum Gönder