Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/libs/graph/example/johnson-eg.cpp @ 47

Last change on this file since 47 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 2.5 KB
Line 
1//=======================================================================
2// Copyright 2001 Jeremy G. Siek, Andrew Lumsdaine, Lie-Quan Lee,
3//
4// Distributed under the Boost Software License, Version 1.0. (See
5// accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7//=======================================================================
8#include <boost/config.hpp>
9#include <fstream>
10#include <iostream>
11#include <iomanip>
12#include <vector>
13#include <boost/property_map.hpp>
14#include <boost/graph/adjacency_list.hpp>
15#include <boost/graph/graphviz.hpp>
16#include <boost/graph/johnson_all_pairs_shortest.hpp>
17
18int
19main()
20{
21  using namespace boost;
22  typedef adjacency_list<vecS, vecS, directedS, no_property,
23    property< edge_weight_t, int, property< edge_weight2_t, int > > > Graph;
24  const int V = 5;
25  typedef std::pair < int, int >Edge;
26  Edge edge_array[] =
27    { Edge(0, 1), Edge(0, 4), Edge(0, 2), Edge(1, 3), Edge(1, 4),
28    Edge(2, 1), Edge(3, 2), Edge(3, 0), Edge(4, 3)
29  };
30  const std::size_t E = sizeof(edge_array) / sizeof(Edge);
31#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
32  // VC++ can't handle the iterator constructor
33  Graph g(V);
34  for (std::size_t j = 0; j < E; ++j)
35    add_edge(edge_array[j].first, edge_array[j].second, g);
36#else
37  Graph g(edge_array, edge_array + E, V);
38#endif
39
40  property_map < Graph, edge_weight_t >::type w = get(edge_weight, g);
41  int weights[] = { 3, -4, 8, 1, 7, 4, -5, 2, 6 };
42  int *wp = weights;
43
44  graph_traits < Graph >::edge_iterator e, e_end;
45  for (boost::tie(e, e_end) = edges(g); e != e_end; ++e)
46    w[*e] = *wp++;
47
48  std::vector < int >d(V, (std::numeric_limits < int >::max)());
49  int D[V][V];
50  johnson_all_pairs_shortest_paths(g, D, distance_map(&d[0]));
51
52  std::cout << "     ";
53  for (int k = 0; k < V; ++k)
54    std::cout << std::setw(5) << k;
55  std::cout << std::endl;
56  for (int i = 0; i < V; ++i) {
57    std::cout << i << " -> ";
58    for (int j = 0; j < V; ++j) {
59      if (D[i][j] > 20 || D[i][j] < -20)
60        std::cout << std::setw(5) << "inf";
61      else
62        std::cout << std::setw(5) << D[i][j];
63    }
64    std::cout << std::endl;
65  }
66
67  std::ofstream fout("figs/johnson-eg.dot");
68  fout << "digraph A {\n"
69    << "  rankdir=LR\n"
70    << "size=\"5,3\"\n"
71    << "ratio=\"fill\"\n"
72    << "edge[style=\"bold\"]\n" << "node[shape=\"circle\"]\n";
73
74  graph_traits < Graph >::edge_iterator ei, ei_end;
75  for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
76    fout << source(*ei, g) << " -> " << target(*ei, g)
77      << "[label=" << get(edge_weight, g)[*ei] << "]\n";
78
79  fout << "}\n";
80  return 0;
81}
Note: See TracBrowser for help on using the repository browser.