src/test/heap_test.h
author alpar
Sun, 06 Mar 2005 20:44:29 +0000
changeset 1199 19eae67d97d5
child 1206 9c398137c2cb
permissions -rw-r--r--
Missing #ifndef-#define
deba@1187
     1
// -+- c++ -+-
deba@1187
     2
#include <vector>
deba@1187
     3
#include <algorithm>
deba@1187
     4
deba@1187
     5
#include <lemon/bin_heap.h>
deba@1187
     6
#include <lemon/fib_heap.h>
deba@1187
     7
#include <lemon/radix_heap.h>
deba@1187
     8
deba@1187
     9
#include <lemon/dijkstra.h>
deba@1187
    10
deba@1187
    11
class IntIntMap : public std::vector<int> {
deba@1187
    12
public:
deba@1187
    13
  typedef std::vector<int> Parent;
deba@1187
    14
deba@1187
    15
  IntIntMap() : Parent() {}
deba@1187
    16
  IntIntMap(int n) : Parent(n) {}
deba@1187
    17
  IntIntMap(int n, int v) : Parent(n, v) {}
deba@1187
    18
deba@1187
    19
  void set(int key, int value) {
deba@1187
    20
    Parent::operator[](key) = value;
deba@1187
    21
  }
deba@1187
    22
};
deba@1187
    23
deba@1187
    24
deba@1187
    25
template <typename _Heap>
deba@1187
    26
void heapSortTest(int n) {
deba@1187
    27
  typedef _Heap Heap;
deba@1187
    28
  IntIntMap map(n, -1);
deba@1187
    29
deba@1187
    30
  Heap heap(map);
deba@1187
    31
  
deba@1187
    32
  std::vector<int> v(n);
deba@1187
    33
deba@1187
    34
  for (int i = 0; i < n; ++i) {
deba@1187
    35
    v[i] = rand() % 1000;
deba@1187
    36
    heap.push(i, v[i]);
deba@1187
    37
  }
deba@1187
    38
  std::sort(v.begin(), v.end());
deba@1187
    39
  for (int i = 0; i < n; ++i) {
deba@1187
    40
    check(v[i] == heap.prio() ,"Wrong order in heap sort.");
deba@1187
    41
    heap.pop();
deba@1187
    42
  }
deba@1187
    43
}
deba@1187
    44
deba@1187
    45
template <typename _Traits, typename _Heap>
deba@1187
    46
struct DefHeapTraits : public _Traits {
deba@1187
    47
  typedef _Heap Heap;
deba@1187
    48
};
deba@1187
    49
deba@1187
    50
template <typename _Graph, typename _LengthMap, typename _Heap>
deba@1187
    51
void dijkstraHeapTest(_Graph& graph, _LengthMap& length,
deba@1187
    52
		      typename _Graph::Node& start) {
deba@1187
    53
deba@1187
    54
  typedef _Heap Heap;
deba@1187
    55
  typedef _Graph Graph;
deba@1187
    56
  typedef _LengthMap LengthMap;
deba@1187
    57
deba@1187
    58
  typedef typename Graph::Node Node;
deba@1187
    59
  typedef typename Graph::Edge Edge;
deba@1187
    60
  typedef typename Graph::NodeIt NodeIt;
deba@1187
    61
  typedef typename Graph::EdgeIt EdgeIt;
deba@1187
    62
deba@1187
    63
  Dijkstra<Graph, LengthMap, 
deba@1187
    64
    DefHeapTraits<DijkstraDefaultTraits<Graph, LengthMap>, Heap> > 
deba@1187
    65
    dijkstra(graph, length);
deba@1187
    66
deba@1187
    67
  dijkstra.run(start);
deba@1187
    68
deba@1187
    69
  for(EdgeIt e(graph); e!=INVALID; ++e) {
deba@1187
    70
    Node u=graph.source(e); 
deba@1187
    71
    Node v=graph.target(e);
deba@1187
    72
    if (dijkstra.reached(u)) {
deba@1187
    73
      check( dijkstra.dist(v) - dijkstra.dist(u) <= length[e],
deba@1187
    74
	     "Error in a shortest path tree edge!");
deba@1187
    75
    }
deba@1187
    76
  }
deba@1187
    77
deba@1187
    78
  for(NodeIt v(graph); v!=INVALID; ++v) {
deba@1187
    79
    if ( dijkstra.reached(v) ) {
deba@1187
    80
      Edge e=dijkstra.pred(v);
deba@1187
    81
      Node u=graph.source(e);
deba@1187
    82
      check( dijkstra.dist(v) - dijkstra .dist(u) == length[e],
deba@1187
    83
	     "Error in a shortest path tree edge!");
deba@1187
    84
    }
deba@1187
    85
  }
deba@1187
    86
deba@1187
    87
}