| // (C) Copyright 2009 Andrew Sutton |
| // |
| // Use, modification and distribution are subject to the |
| // Boost Software License, Version 1.0 (See accompanying file |
| // LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
| |
| #include <iostream> |
| #include <string> |
| #include <set> |
| |
| #include <boost/assert.hpp> |
| #include <boost/range.hpp> |
| |
| #include <boost/graph/undirected_graph.hpp> |
| #include <boost/graph/directed_graph.hpp> |
| #include <boost/graph/labeled_graph.hpp> |
| |
| #include "typestr.hpp" |
| |
| using std::cout; |
| using std::string; |
| using namespace boost; |
| |
| void test_norm(); |
| void test_temp(); |
| void test_bacon(); |
| |
| int main() { |
| test_norm(); |
| test_temp(); |
| test_bacon(); |
| } |
| |
| ////////////////////////////////////// |
| // Utility Functions and Types |
| ////////////////////////////////////// |
| |
| |
| struct Actor { |
| Actor() { } |
| Actor(string const& s) : name(s) { } |
| string name; |
| }; |
| |
| struct Movie { |
| Movie() { } |
| Movie(string const& s) : name(s) { } |
| string name; |
| }; |
| |
| |
| template <typename Graph> |
| void init_graph(Graph& g) { |
| for(int i = 0; i < 6; ++i) { |
| add_vertex(i, g); |
| } |
| } |
| |
| template <typename Graph> |
| void label_graph(Graph& g) |
| { |
| typedef typename graph_traits<Graph>::vertex_iterator Iter; |
| Iter f, l; |
| int x = 0; |
| for(tie(f, l) = vertices(g); f != l; ++f, ++x) { |
| label_vertex(*f, x, g); |
| } |
| } |
| |
| template <typename Graph> |
| void build_graph(Graph& g) { |
| // This is the graph shown on the wikipedia page for Graph Theory. |
| add_edge_by_label(5, 3, g); |
| add_edge_by_label(3, 4, g); |
| add_edge_by_label(3, 2, g); |
| add_edge_by_label(4, 1, g); |
| add_edge_by_label(4, 0, g); |
| add_edge_by_label(2, 1, g); |
| add_edge_by_label(1, 0, g); |
| BOOST_ASSERT(num_vertices(g) == 6); |
| BOOST_ASSERT(num_edges(g) == 7); |
| } |
| |
| ////////////////////////////////////// |
| // Temporal Labelings |
| ////////////////////////////////////// |
| |
| void test_norm() { |
| { |
| typedef labeled_graph<undirected_graph<>, unsigned> Graph; |
| Graph g; |
| init_graph(g); |
| build_graph(g); |
| } |
| |
| { |
| typedef labeled_graph<directed_graph<>, unsigned> Graph; |
| Graph g; |
| init_graph(g); |
| build_graph(g); |
| } |
| } |
| |
| ////////////////////////////////////// |
| // Temporal Labelings |
| ////////////////////////////////////// |
| |
| |
| void test_temp() { |
| typedef undirected_graph<> Graph; |
| typedef labeled_graph<Graph*, int> LabGraph; |
| Graph g(6); |
| LabGraph lg(&g); |
| label_graph(lg); |
| build_graph(lg); |
| } |
| |
| ////////////////////////////////////// |
| // Labeled w/ Properties |
| ////////////////////////////////////// |
| |
| void test_bacon() { |
| string bacon("Kevin Bacon"); |
| string slater("Christian Slater"); |
| Movie murder("Murder in the First"); |
| { |
| |
| typedef labeled_graph<undirected_graph<Actor, Movie>, string> Graph; |
| Graph g; |
| add_vertex(bacon, g); |
| add_vertex(slater, g); |
| add_edge_by_label(bacon, slater, murder, g); |
| } |
| |
| { |
| string bacon = "Kevin Bacon"; |
| string slater = "Christian Slater"; |
| |
| typedef labeled_graph<directed_graph<Actor, Movie>, string> Graph; |
| Graph g; |
| add_vertex(bacon, g); |
| add_vertex(slater, g); |
| add_edge_by_label(bacon, slater, murder, g); |
| } |
| } |