-
Notifications
You must be signed in to change notification settings - Fork 4
/
BFSVisitor.h
57 lines (51 loc) · 1.99 KB
/
BFSVisitor.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//=======================================================================
// Copyright 2015 - 2020 Jeff Linahan
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//=======================================================================
#pragma once
#include "BFSVisitorData.h"
#include "typedefs.h"
#include <boost/lexical_cast.hpp>
#include <boost/graph/graph_concepts.hpp>
#include <boost/graph/planar_canonical_ordering.hpp>
#include <boost/graph/is_straight_line_drawing.hpp>
#include <boost/graph/boyer_myrvold_planar_test.hpp>
#include <boost/graph/make_biconnected_planar.hpp>
#include <boost/graph/make_maximal_planar.hpp>
#include <boost/graph/connected_components.hpp>
#include <boost/config.hpp>
#include <boost/graph/breadth_first_search.hpp>
#include <boost/pending/indirect_cmp.hpp>
#include <boost/range/irange.hpp>
#include <boost/graph/copy.hpp>
#include <iostream>
struct BFSVisitor : boost::default_bfs_visitor
{
BFSVisitorData& data;
BFSVisitor(BFSVisitorData& data) : data(data) {}
//void examine_edge(edge_t e, GraphCR g) {exit(0);};
template<typename Edge> void tree_edge(Edge e, Graph const& g)
{
auto parent = source(e, g);
auto child = target(e, g);
data.tree_edges.push_back(e);
std::cout << " tree edge " << parent << ", " << child << '\n';
data.verts[child].parent = parent;
data.verts[child].level = data.verts[parent].level + 1;
data.num_levels = std::max(data.num_levels, data.verts[child].level + 1);
if( Graph::null_vertex() != parent ) data.children[parent].insert(child);
vertex_t v = child;
data.verts[v].descendant_cost = 1;
std::cout << " vertex/descendant cost: ";
std::cout << v << '/' << data.verts[v].descendant_cost << " ";
while( data.verts[v].level ){
v = data.verts[v].parent;
++data.verts[v].descendant_cost;
std::cout << v << '/' << data.verts[v].descendant_cost << " ";
}
std::cout << '\n';
}
};