demo/grid_graph_demo.cc
author hegyi
Thu, 05 Jan 2006 12:30:09 +0000
changeset 1878 409a31271efd
parent 1775 f19e108cb286
child 1956 a055123339d5
permissions -rw-r--r--
Several changes. \n If new map is added to mapstorage it emits signal with the name of the new map. This was important, because from now on not only tha mapwin should be updated. \n Furthermore algobox gets a pointer to mapstorage instead of only the mapnames from it. This is important because without it it would be complicated to pass all of the required maps to algobox.
deba@1680
     1
#include <lemon/grid_graph.h>
deba@1680
     2
#include <lemon/graph_adaptor.h>
deba@1680
     3
#include <lemon/graph_to_eps.h>
deba@1681
     4
#include <lemon/bfs.h>
deba@1680
     5
#include <lemon/xy.h>
deba@1680
     6
deba@1680
     7
#include <iostream>
deba@1680
     8
#include <fstream>
deba@1680
     9
deba@1775
    10
///\ingroup demos
deba@1775
    11
///\file
deba@1775
    12
///\brief Labirinth example with grid graph.
deba@1775
    13
///
deba@1775
    14
///  Labirinth example with grid graph.
deba@1775
    15
///
deba@1775
    16
/// The input file is:
deba@1775
    17
///
deba@1775
    18
/// \include grid_graph_demo.in
deba@1775
    19
///
deba@1775
    20
/// The result:
deba@1775
    21
///
deba@1775
    22
/// \image html grid_graph_demo.png
deba@1775
    23
/// \image latex grid_graph_demo.eps "The labirinth" width=\textwidth
deba@1775
    24
///
deba@1775
    25
/// The source:
deba@1775
    26
///
deba@1775
    27
/// \include grid_graph_demo.cc
deba@1775
    28
deba@1680
    29
using namespace lemon;
deba@1680
    30
using namespace std;
deba@1680
    31
deba@1680
    32
int main() {
deba@1681
    33
  ifstream in("grid_graph_demo.in");
deba@1681
    34
  int width, height;
deba@1681
    35
  in >> width >> height;
deba@1681
    36
  int start_x, start_y;
deba@1681
    37
  in >> start_x >> start_y;
deba@1681
    38
  int stop_x, stop_y;
deba@1681
    39
  in >> stop_x >> stop_y;
deba@1681
    40
deba@1681
    41
  GridGraph graph(width, height);
deba@1681
    42
  GridGraph::Node start = graph(start_x - 1, start_y - 1);
deba@1681
    43
  GridGraph::Node stop = graph(stop_x - 1, stop_y - 1);
deba@1681
    44
  GridGraph::NodeMap<bool> filter(graph);
deba@1681
    45
deba@1681
    46
  for (int j = 0; j < height; ++j) {
deba@1681
    47
    in >> ws;
deba@1681
    48
    for (int i = 0; i < width; ++i) {
deba@1681
    49
      char c; in >> c;
deba@1681
    50
      filter[graph(i, j)] = (c == '.');
deba@1681
    51
    }
deba@1681
    52
  }
deba@1681
    53
deba@1681
    54
  typedef NodeSubGraphAdaptor<GridGraph,
deba@1681
    55
    GridGraph::NodeMap<bool> > FilteredGraph;
deba@1681
    56
deba@1681
    57
  FilteredGraph filtered(graph, filter);
deba@1681
    58
deba@1681
    59
  Bfs<FilteredGraph> bfs(filtered);
deba@1681
    60
  std::cout << "The length of shortest path: " << 
deba@1681
    61
    bfs.run(start, stop) << std::endl;
deba@1681
    62
deba@1693
    63
  FilteredGraph::EdgeMap<bool> path(filtered, false);
deba@1681
    64
  
deba@1681
    65
  for (GridGraph::Node node = stop; 
deba@1681
    66
       node != start; node = bfs.predNode(node)) {
deba@1763
    67
    path[bfs.predEdge(node)] = true;
deba@1681
    68
  }
deba@1681
    69
  
deba@1775
    70
  graphToEps(filtered, "grid_graph_demo.eps").scaleToA4().
deba@1680
    71
    title("Grid graph").
alpar@1875
    72
    copyright("(C) 2006 LEMON Project").
deba@1693
    73
    coords(scaleMap(indexMap(graph), 10)).
deba@1680
    74
    enableParallel().
deba@1693
    75
    nodeScale(0.5).
deba@1680
    76
    drawArrows().
deba@1693
    77
    edgeColors(composeMap(ColorSet(), path)).
deba@1680
    78
    run();
deba@1681
    79
  
deba@1775
    80
  std::cout << "The shortest path is written to grid_graph_demo.eps" 
deba@1775
    81
	    << std::endl;
deba@1681
    82
deba@1680
    83
  return 0;
deba@1680
    84
}