gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Small doc improvements (#304)
0 4 0
default
4 files changed with 166 insertions and 174 deletions:
↑ Collapse diff ↑
Show white space 96 line context
... ...
@@ -2,146 +2,147 @@
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_BFS_H
20 20
#define LEMON_BFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief BFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Bfs class.
36 36

	
37 37
  ///Default traits class of Bfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct BfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the shortest paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the shortest paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%BFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %BFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref bfs() "function-type interface" for the BFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=BfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Bfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///shortest paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

	
... ...
@@ -180,157 +181,157 @@
180 181

	
181 182
    //Creates the maps if necessary.
182 183
    void create_maps()
183 184
    {
184 185
      if(!_pred) {
185 186
        local_pred = true;
186 187
        _pred = Traits::createPredMap(*G);
187 188
      }
188 189
      if(!_dist) {
189 190
        local_dist = true;
190 191
        _dist = Traits::createDistMap(*G);
191 192
      }
192 193
      if(!_reached) {
193 194
        local_reached = true;
194 195
        _reached = Traits::createReachedMap(*G);
195 196
      }
196 197
      if(!_processed) {
197 198
        local_processed = true;
198 199
        _processed = Traits::createProcessedMap(*G);
199 200
      }
200 201
    }
201 202

	
202 203
  protected:
203 204

	
204 205
    Bfs() {}
205 206

	
206 207
  public:
207 208

	
208 209
    typedef Bfs Create;
209 210

	
210 211
    ///\name Named Template Parameters
211 212

	
212 213
    ///@{
213 214

	
214 215
    template <class T>
215 216
    struct SetPredMapTraits : public Traits {
216 217
      typedef T PredMap;
217 218
      static PredMap *createPredMap(const Digraph &)
218 219
      {
219 220
        LEMON_ASSERT(false, "PredMap is not initialized");
220 221
        return 0; // ignore warnings
221 222
      }
222 223
    };
223 224
    ///\brief \ref named-templ-param "Named parameter" for setting
224 225
    ///\c PredMap type.
225 226
    ///
226 227
    ///\ref named-templ-param "Named parameter" for setting
227 228
    ///\c PredMap type.
228
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
229
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
229 230
    template <class T>
230 231
    struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > {
231 232
      typedef Bfs< Digraph, SetPredMapTraits<T> > Create;
232 233
    };
233 234

	
234 235
    template <class T>
235 236
    struct SetDistMapTraits : public Traits {
236 237
      typedef T DistMap;
237 238
      static DistMap *createDistMap(const Digraph &)
238 239
      {
239 240
        LEMON_ASSERT(false, "DistMap is not initialized");
240 241
        return 0; // ignore warnings
241 242
      }
242 243
    };
243 244
    ///\brief \ref named-templ-param "Named parameter" for setting
244 245
    ///\c DistMap type.
245 246
    ///
246 247
    ///\ref named-templ-param "Named parameter" for setting
247 248
    ///\c DistMap type.
248
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
249
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
249 250
    template <class T>
250 251
    struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > {
251 252
      typedef Bfs< Digraph, SetDistMapTraits<T> > Create;
252 253
    };
253 254

	
254 255
    template <class T>
255 256
    struct SetReachedMapTraits : public Traits {
256 257
      typedef T ReachedMap;
257 258
      static ReachedMap *createReachedMap(const Digraph &)
258 259
      {
259 260
        LEMON_ASSERT(false, "ReachedMap is not initialized");
260 261
        return 0; // ignore warnings
261 262
      }
262 263
    };
263 264
    ///\brief \ref named-templ-param "Named parameter" for setting
264 265
    ///\c ReachedMap type.
265 266
    ///
266 267
    ///\ref named-templ-param "Named parameter" for setting
267 268
    ///\c ReachedMap type.
268
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
269 270
    template <class T>
270 271
    struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > {
271 272
      typedef Bfs< Digraph, SetReachedMapTraits<T> > Create;
272 273
    };
273 274

	
274 275
    template <class T>
275 276
    struct SetProcessedMapTraits : public Traits {
276 277
      typedef T ProcessedMap;
277 278
      static ProcessedMap *createProcessedMap(const Digraph &)
278 279
      {
279 280
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
280 281
        return 0; // ignore warnings
281 282
      }
282 283
    };
283 284
    ///\brief \ref named-templ-param "Named parameter" for setting
284 285
    ///\c ProcessedMap type.
285 286
    ///
286 287
    ///\ref named-templ-param "Named parameter" for setting
287 288
    ///\c ProcessedMap type.
288
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
289
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
289 290
    template <class T>
290 291
    struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > {
291 292
      typedef Bfs< Digraph, SetProcessedMapTraits<T> > Create;
292 293
    };
293 294

	
294 295
    struct SetStandardProcessedMapTraits : public Traits {
295 296
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
296 297
      static ProcessedMap *createProcessedMap(const Digraph &g)
297 298
      {
298 299
        return new ProcessedMap(g);
299 300
        return 0; // ignore warnings
300 301
      }
301 302
    };
302 303
    ///\brief \ref named-templ-param "Named parameter" for setting
303 304
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
304 305
    ///
305 306
    ///\ref named-templ-param "Named parameter" for setting
306 307
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
307 308
    ///If you don't set it explicitly, it will be automatically allocated.
308 309
    struct SetStandardProcessedMap :
309 310
      public Bfs< Digraph, SetStandardProcessedMapTraits > {
310 311
      typedef Bfs< Digraph, SetStandardProcessedMapTraits > Create;
311 312
    };
312 313

	
313 314
    ///@}
314 315

	
315 316
  public:
316 317

	
317 318
    ///Constructor.
318 319

	
319 320
    ///Constructor.
320 321
    ///\param g The digraph the algorithm runs on.
321 322
    Bfs(const Digraph &g) :
322 323
      G(&g),
323 324
      _pred(NULL), local_pred(false),
324 325
      _dist(NULL), local_dist(false),
325 326
      _reached(NULL), local_reached(false),
326 327
      _processed(NULL), local_processed(false)
327 328
    { }
328 329

	
329 330
    ///Destructor.
330 331
    ~Bfs()
331 332
    {
332 333
      if(local_pred) delete _pred;
333 334
      if(local_dist) delete _dist;
334 335
      if(local_reached) delete _reached;
335 336
      if(local_processed) delete _processed;
336 337
    }
... ...
@@ -692,485 +693,481 @@
692 693
    ///  b.start(t);
693 694
    ///\endcode
694 695
    bool run(Node s,Node t) {
695 696
      init();
696 697
      addSource(s);
697 698
      start(t);
698 699
      return reached(t);
699 700
    }
700 701

	
701 702
    ///Runs the algorithm to visit all nodes in the digraph.
702 703

	
703 704
    ///This method runs the %BFS algorithm in order to
704 705
    ///compute the shortest path to each node.
705 706
    ///
706 707
    ///The algorithm computes
707 708
    ///- the shortest path tree (forest),
708 709
    ///- the distance of each node from the root(s).
709 710
    ///
710 711
    ///\note <tt>b.run(s)</tt> is just a shortcut of the following code.
711 712
    ///\code
712 713
    ///  b.init();
713 714
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
714 715
    ///    if (!b.reached(n)) {
715 716
    ///      b.addSource(n);
716 717
    ///      b.start();
717 718
    ///    }
718 719
    ///  }
719 720
    ///\endcode
720 721
    void run() {
721 722
      init();
722 723
      for (NodeIt n(*G); n != INVALID; ++n) {
723 724
        if (!reached(n)) {
724 725
          addSource(n);
725 726
          start();
726 727
        }
727 728
      }
728 729
    }
729 730

	
730 731
    ///@}
731 732

	
732 733
    ///\name Query Functions
733 734
    ///The results of the BFS algorithm can be obtained using these
734 735
    ///functions.\n
735 736
    ///Either \ref run(Node) "run()" or \ref start() should be called
736 737
    ///before using them.
737 738

	
738 739
    ///@{
739 740

	
740
    ///The shortest path to a node.
741
    ///The shortest path to the given node.
741 742

	
742
    ///Returns the shortest path to a node.
743
    ///Returns the shortest path to the given node from the root(s).
743 744
    ///
744 745
    ///\warning \c t should be reached from the root(s).
745 746
    ///
746 747
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 748
    ///must be called before using this function.
748 749
    Path path(Node t) const { return Path(*G, *_pred, t); }
749 750

	
750
    ///The distance of a node from the root(s).
751
    ///The distance of the given node from the root(s).
751 752

	
752
    ///Returns the distance of a node from the root(s).
753
    ///Returns the distance of the given node from the root(s).
753 754
    ///
754 755
    ///\warning If node \c v is not reached from the root(s), then
755 756
    ///the return value of this function is undefined.
756 757
    ///
757 758
    ///\pre Either \ref run(Node) "run()" or \ref init()
758 759
    ///must be called before using this function.
759 760
    int dist(Node v) const { return (*_dist)[v]; }
760 761

	
761
    ///Returns the 'previous arc' of the shortest path tree for a node.
762

	
762
    ///\brief Returns the 'previous arc' of the shortest path tree for
763
    ///the given node.
764
    ///
763 765
    ///This function returns the 'previous arc' of the shortest path
764 766
    ///tree for the node \c v, i.e. it returns the last arc of a
765 767
    ///shortest path from a root to \c v. It is \c INVALID if \c v
766 768
    ///is not reached from the root(s) or if \c v is a root.
767 769
    ///
768 770
    ///The shortest path tree used here is equal to the shortest path
769
    ///tree used in \ref predNode().
771
    ///tree used in \ref predNode() and \ref predMap().
770 772
    ///
771 773
    ///\pre Either \ref run(Node) "run()" or \ref init()
772 774
    ///must be called before using this function.
773 775
    Arc predArc(Node v) const { return (*_pred)[v];}
774 776

	
775
    ///Returns the 'previous node' of the shortest path tree for a node.
776

	
777
    ///\brief Returns the 'previous node' of the shortest path tree for
778
    ///the given node.
779
    ///
777 780
    ///This function returns the 'previous node' of the shortest path
778 781
    ///tree for the node \c v, i.e. it returns the last but one node
779
    ///from a shortest path from a root to \c v. It is \c INVALID
782
    ///of a shortest path from a root to \c v. It is \c INVALID
780 783
    ///if \c v is not reached from the root(s) or if \c v is a root.
781 784
    ///
782 785
    ///The shortest path tree used here is equal to the shortest path
783
    ///tree used in \ref predArc().
786
    ///tree used in \ref predArc() and \ref predMap().
784 787
    ///
785 788
    ///\pre Either \ref run(Node) "run()" or \ref init()
786 789
    ///must be called before using this function.
787 790
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
788 791
                                  G->source((*_pred)[v]); }
789 792

	
790 793
    ///\brief Returns a const reference to the node map that stores the
791 794
    /// distances of the nodes.
792 795
    ///
793 796
    ///Returns a const reference to the node map that stores the distances
794 797
    ///of the nodes calculated by the algorithm.
795 798
    ///
796 799
    ///\pre Either \ref run(Node) "run()" or \ref init()
797 800
    ///must be called before using this function.
798 801
    const DistMap &distMap() const { return *_dist;}
799 802

	
800 803
    ///\brief Returns a const reference to the node map that stores the
801 804
    ///predecessor arcs.
802 805
    ///
803 806
    ///Returns a const reference to the node map that stores the predecessor
804
    ///arcs, which form the shortest path tree.
807
    ///arcs, which form the shortest path tree (forest).
805 808
    ///
806 809
    ///\pre Either \ref run(Node) "run()" or \ref init()
807 810
    ///must be called before using this function.
808 811
    const PredMap &predMap() const { return *_pred;}
809 812

	
810
    ///Checks if a node is reached from the root(s).
813
    ///Checks if the given node is reached from the root(s).
811 814

	
812 815
    ///Returns \c true if \c v is reached from the root(s).
813 816
    ///
814 817
    ///\pre Either \ref run(Node) "run()" or \ref init()
815 818
    ///must be called before using this function.
816 819
    bool reached(Node v) const { return (*_reached)[v]; }
817 820

	
818 821
    ///@}
819 822
  };
820 823

	
821 824
  ///Default traits class of bfs() function.
822 825

	
823 826
  ///Default traits class of bfs() function.
824 827
  ///\tparam GR Digraph type.
825 828
  template<class GR>
826 829
  struct BfsWizardDefaultTraits
827 830
  {
828 831
    ///The type of the digraph the algorithm runs on.
829 832
    typedef GR Digraph;
830 833

	
831 834
    ///\brief The type of the map that stores the predecessor
832 835
    ///arcs of the shortest paths.
833 836
    ///
834 837
    ///The type of the map that stores the predecessor
835 838
    ///arcs of the shortest paths.
836
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
839
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
837 840
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
838 841
    ///Instantiates a PredMap.
839 842

	
840 843
    ///This function instantiates a PredMap.
841 844
    ///\param g is the digraph, to which we would like to define the
842 845
    ///PredMap.
843 846
    static PredMap *createPredMap(const Digraph &g)
844 847
    {
845 848
      return new PredMap(g);
846 849
    }
847 850

	
848 851
    ///The type of the map that indicates which nodes are processed.
849 852

	
850 853
    ///The type of the map that indicates which nodes are processed.
851
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
854
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
852 855
    ///By default it is a NullMap.
853 856
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
854 857
    ///Instantiates a ProcessedMap.
855 858

	
856 859
    ///This function instantiates a ProcessedMap.
857 860
    ///\param g is the digraph, to which
858 861
    ///we would like to define the ProcessedMap.
859 862
#ifdef DOXYGEN
860 863
    static ProcessedMap *createProcessedMap(const Digraph &g)
861 864
#else
862 865
    static ProcessedMap *createProcessedMap(const Digraph &)
863 866
#endif
864 867
    {
865 868
      return new ProcessedMap();
866 869
    }
867 870

	
868 871
    ///The type of the map that indicates which nodes are reached.
869 872

	
870 873
    ///The type of the map that indicates which nodes are reached.
871
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
874
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
872 875
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
873 876
    ///Instantiates a ReachedMap.
874 877

	
875 878
    ///This function instantiates a ReachedMap.
876 879
    ///\param g is the digraph, to which
877 880
    ///we would like to define the ReachedMap.
878 881
    static ReachedMap *createReachedMap(const Digraph &g)
879 882
    {
880 883
      return new ReachedMap(g);
881 884
    }
882 885

	
883 886
    ///The type of the map that stores the distances of the nodes.
884 887

	
885 888
    ///The type of the map that stores the distances of the nodes.
886
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
889
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
887 890
    typedef typename Digraph::template NodeMap<int> DistMap;
888 891
    ///Instantiates a DistMap.
889 892

	
890 893
    ///This function instantiates a DistMap.
891 894
    ///\param g is the digraph, to which we would like to define
892 895
    ///the DistMap
893 896
    static DistMap *createDistMap(const Digraph &g)
894 897
    {
895 898
      return new DistMap(g);
896 899
    }
897 900

	
898 901
    ///The type of the shortest paths.
899 902

	
900 903
    ///The type of the shortest paths.
901
    ///It must meet the \ref concepts::Path "Path" concept.
904
    ///It must conform to the \ref concepts::Path "Path" concept.
902 905
    typedef lemon::Path<Digraph> Path;
903 906
  };
904 907

	
905 908
  /// Default traits class used by BfsWizard
906 909

	
907
  /// To make it easier to use Bfs algorithm
908
  /// we have created a wizard class.
909
  /// This \ref BfsWizard class needs default traits,
910
  /// as well as the \ref Bfs class.
911
  /// The \ref BfsWizardBase is a class to be the default traits of the
912
  /// \ref BfsWizard class.
910
  /// Default traits class used by BfsWizard.
911
  /// \tparam GR The type of the digraph.
913 912
  template<class GR>
914 913
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
915 914
  {
916 915

	
917 916
    typedef BfsWizardDefaultTraits<GR> Base;
918 917
  protected:
919 918
    //The type of the nodes in the digraph.
920 919
    typedef typename Base::Digraph::Node Node;
921 920

	
922 921
    //Pointer to the digraph the algorithm runs on.
923 922
    void *_g;
924 923
    //Pointer to the map of reached nodes.
925 924
    void *_reached;
926 925
    //Pointer to the map of processed nodes.
927 926
    void *_processed;
928 927
    //Pointer to the map of predecessors arcs.
929 928
    void *_pred;
930 929
    //Pointer to the map of distances.
931 930
    void *_dist;
932 931
    //Pointer to the shortest path to the target node.
933 932
    void *_path;
934 933
    //Pointer to the distance of the target node.
935 934
    int *_di;
936 935

	
937 936
    public:
938 937
    /// Constructor.
939 938

	
940
    /// This constructor does not require parameters, therefore it initiates
939
    /// This constructor does not require parameters, it initiates
941 940
    /// all of the attributes to \c 0.
942 941
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
943 942
                      _dist(0), _path(0), _di(0) {}
944 943

	
945 944
    /// Constructor.
946 945

	
947 946
    /// This constructor requires one parameter,
948 947
    /// others are initiated to \c 0.
949 948
    /// \param g The digraph the algorithm runs on.
950 949
    BfsWizardBase(const GR &g) :
951 950
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
952 951
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
953 952

	
954 953
  };
955 954

	
956 955
  /// Auxiliary class for the function-type interface of BFS algorithm.
957 956

	
958 957
  /// This auxiliary class is created to implement the
959 958
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
960 959
  /// It does not have own \ref run(Node) "run()" method, it uses the
961 960
  /// functions and features of the plain \ref Bfs.
962 961
  ///
963 962
  /// This class should only be used through the \ref bfs() function,
964 963
  /// which makes it easier to use the algorithm.
965 964
  template<class TR>
966 965
  class BfsWizard : public TR
967 966
  {
968 967
    typedef TR Base;
969 968

	
970
    ///The type of the digraph the algorithm runs on.
971 969
    typedef typename TR::Digraph Digraph;
972 970

	
973 971
    typedef typename Digraph::Node Node;
974 972
    typedef typename Digraph::NodeIt NodeIt;
975 973
    typedef typename Digraph::Arc Arc;
976 974
    typedef typename Digraph::OutArcIt OutArcIt;
977 975

	
978
    ///\brief The type of the map that stores the predecessor
979
    ///arcs of the shortest paths.
980 976
    typedef typename TR::PredMap PredMap;
981
    ///\brief The type of the map that stores the distances of the nodes.
982 977
    typedef typename TR::DistMap DistMap;
983
    ///\brief The type of the map that indicates which nodes are reached.
984 978
    typedef typename TR::ReachedMap ReachedMap;
985
    ///\brief The type of the map that indicates which nodes are processed.
986 979
    typedef typename TR::ProcessedMap ProcessedMap;
987
    ///The type of the shortest paths
988 980
    typedef typename TR::Path Path;
989 981

	
990 982
  public:
991 983

	
992 984
    /// Constructor.
993 985
    BfsWizard() : TR() {}
994 986

	
995 987
    /// Constructor that requires parameters.
996 988

	
997 989
    /// Constructor that requires parameters.
998 990
    /// These parameters will be the default values for the traits class.
999 991
    /// \param g The digraph the algorithm runs on.
1000 992
    BfsWizard(const Digraph &g) :
1001 993
      TR(g) {}
1002 994

	
1003 995
    ///Copy constructor
1004 996
    BfsWizard(const TR &b) : TR(b) {}
1005 997

	
1006 998
    ~BfsWizard() {}
1007 999

	
1008 1000
    ///Runs BFS algorithm from the given source node.
1009 1001

	
1010 1002
    ///This method runs BFS algorithm from node \c s
1011 1003
    ///in order to compute the shortest path to each node.
1012 1004
    void run(Node s)
1013 1005
    {
1014 1006
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1015 1007
      if (Base::_pred)
1016 1008
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1017 1009
      if (Base::_dist)
1018 1010
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1019 1011
      if (Base::_reached)
1020 1012
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1021 1013
      if (Base::_processed)
1022 1014
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1023 1015
      if (s!=INVALID)
1024 1016
        alg.run(s);
1025 1017
      else
1026 1018
        alg.run();
1027 1019
    }
1028 1020

	
1029 1021
    ///Finds the shortest path between \c s and \c t.
1030 1022

	
1031 1023
    ///This method runs BFS algorithm from node \c s
1032 1024
    ///in order to compute the shortest path to node \c t
1033 1025
    ///(it stops searching when \c t is processed).
1034 1026
    ///
1035 1027
    ///\return \c true if \c t is reachable form \c s.
1036 1028
    bool run(Node s, Node t)
1037 1029
    {
1038 1030
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1039 1031
      if (Base::_pred)
1040 1032
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041 1033
      if (Base::_dist)
1042 1034
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043 1035
      if (Base::_reached)
1044 1036
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1045 1037
      if (Base::_processed)
1046 1038
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1047 1039
      alg.run(s,t);
1048 1040
      if (Base::_path)
1049 1041
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1050 1042
      if (Base::_di)
1051 1043
        *Base::_di = alg.dist(t);
1052 1044
      return alg.reached(t);
1053 1045
    }
1054 1046

	
1055 1047
    ///Runs BFS algorithm to visit all nodes in the digraph.
1056 1048

	
1057 1049
    ///This method runs BFS algorithm in order to compute
1058 1050
    ///the shortest path to each node.
1059 1051
    void run()
1060 1052
    {
1061 1053
      run(INVALID);
1062 1054
    }
1063 1055

	
1064 1056
    template<class T>
1065 1057
    struct SetPredMapBase : public Base {
1066 1058
      typedef T PredMap;
1067 1059
      static PredMap *createPredMap(const Digraph &) { return 0; };
1068 1060
      SetPredMapBase(const TR &b) : TR(b) {}
1069 1061
    };
1070
    ///\brief \ref named-func-param "Named parameter"
1071
    ///for setting PredMap object.
1062

	
1063
    ///\brief \ref named-templ-param "Named parameter" for setting
1064
    ///the predecessor map.
1072 1065
    ///
1073
    ///\ref named-func-param "Named parameter"
1074
    ///for setting PredMap object.
1066
    ///\ref named-templ-param "Named parameter" function for setting
1067
    ///the map that stores the predecessor arcs of the nodes.
1075 1068
    template<class T>
1076 1069
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1077 1070
    {
1078 1071
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1079 1072
      return BfsWizard<SetPredMapBase<T> >(*this);
1080 1073
    }
1081 1074

	
1082 1075
    template<class T>
1083 1076
    struct SetReachedMapBase : public Base {
1084 1077
      typedef T ReachedMap;
1085 1078
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1086 1079
      SetReachedMapBase(const TR &b) : TR(b) {}
1087 1080
    };
1088
    ///\brief \ref named-func-param "Named parameter"
1089
    ///for setting ReachedMap object.
1081

	
1082
    ///\brief \ref named-templ-param "Named parameter" for setting
1083
    ///the reached map.
1090 1084
    ///
1091
    /// \ref named-func-param "Named parameter"
1092
    ///for setting ReachedMap object.
1085
    ///\ref named-templ-param "Named parameter" function for setting
1086
    ///the map that indicates which nodes are reached.
1093 1087
    template<class T>
1094 1088
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1095 1089
    {
1096 1090
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1097 1091
      return BfsWizard<SetReachedMapBase<T> >(*this);
1098 1092
    }
1099 1093

	
1100 1094
    template<class T>
1101 1095
    struct SetDistMapBase : public Base {
1102 1096
      typedef T DistMap;
1103 1097
      static DistMap *createDistMap(const Digraph &) { return 0; };
1104 1098
      SetDistMapBase(const TR &b) : TR(b) {}
1105 1099
    };
1106
    ///\brief \ref named-func-param "Named parameter"
1107
    ///for setting DistMap object.
1100

	
1101
    ///\brief \ref named-templ-param "Named parameter" for setting
1102
    ///the distance map.
1108 1103
    ///
1109
    /// \ref named-func-param "Named parameter"
1110
    ///for setting DistMap object.
1104
    ///\ref named-templ-param "Named parameter" function for setting
1105
    ///the map that stores the distances of the nodes calculated
1106
    ///by the algorithm.
1111 1107
    template<class T>
1112 1108
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1113 1109
    {
1114 1110
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1115 1111
      return BfsWizard<SetDistMapBase<T> >(*this);
1116 1112
    }
1117 1113

	
1118 1114
    template<class T>
1119 1115
    struct SetProcessedMapBase : public Base {
1120 1116
      typedef T ProcessedMap;
1121 1117
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1122 1118
      SetProcessedMapBase(const TR &b) : TR(b) {}
1123 1119
    };
1124
    ///\brief \ref named-func-param "Named parameter"
1125
    ///for setting ProcessedMap object.
1120

	
1121
    ///\brief \ref named-func-param "Named parameter" for setting
1122
    ///the processed map.
1126 1123
    ///
1127
    /// \ref named-func-param "Named parameter"
1128
    ///for setting ProcessedMap object.
1124
    ///\ref named-templ-param "Named parameter" function for setting
1125
    ///the map that indicates which nodes are processed.
1129 1126
    template<class T>
1130 1127
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1131 1128
    {
1132 1129
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1133 1130
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1134 1131
    }
1135 1132

	
1136 1133
    template<class T>
1137 1134
    struct SetPathBase : public Base {
1138 1135
      typedef T Path;
1139 1136
      SetPathBase(const TR &b) : TR(b) {}
1140 1137
    };
1141 1138
    ///\brief \ref named-func-param "Named parameter"
1142 1139
    ///for getting the shortest path to the target node.
1143 1140
    ///
1144 1141
    ///\ref named-func-param "Named parameter"
1145 1142
    ///for getting the shortest path to the target node.
1146 1143
    template<class T>
1147 1144
    BfsWizard<SetPathBase<T> > path(const T &t)
1148 1145
    {
1149 1146
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1150 1147
      return BfsWizard<SetPathBase<T> >(*this);
1151 1148
    }
1152 1149

	
1153 1150
    ///\brief \ref named-func-param "Named parameter"
1154 1151
    ///for getting the distance of the target node.
1155 1152
    ///
1156 1153
    ///\ref named-func-param "Named parameter"
1157 1154
    ///for getting the distance of the target node.
1158 1155
    BfsWizard dist(const int &d)
1159 1156
    {
1160 1157
      Base::_di=const_cast<int*>(&d);
1161 1158
      return *this;
1162 1159
    }
1163 1160

	
1164 1161
  };
1165 1162

	
1166 1163
  ///Function-type interface for BFS algorithm.
1167 1164

	
1168 1165
  /// \ingroup search
1169 1166
  ///Function-type interface for BFS algorithm.
1170 1167
  ///
1171 1168
  ///This function also has several \ref named-func-param "named parameters",
1172 1169
  ///they are declared as the members of class \ref BfsWizard.
1173 1170
  ///The following examples show how to use these parameters.
1174 1171
  ///\code
1175 1172
  ///  // Compute shortest path from node s to each node
1176 1173
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
... ...
@@ -1219,97 +1216,97 @@
1219 1216
    /// \brief Called when an arc is examined but its target node is
1220 1217
    /// already discovered.
1221 1218
    ///
1222 1219
    /// This function is called when an arc is examined but its target node is
1223 1220
    /// already discovered.
1224 1221
    void examine(const Arc& arc) {}
1225 1222
  };
1226 1223
#else
1227 1224
  template <typename GR>
1228 1225
  struct BfsVisitor {
1229 1226
    typedef GR Digraph;
1230 1227
    typedef typename Digraph::Arc Arc;
1231 1228
    typedef typename Digraph::Node Node;
1232 1229
    void start(const Node&) {}
1233 1230
    void reach(const Node&) {}
1234 1231
    void process(const Node&) {}
1235 1232
    void discover(const Arc&) {}
1236 1233
    void examine(const Arc&) {}
1237 1234

	
1238 1235
    template <typename _Visitor>
1239 1236
    struct Constraints {
1240 1237
      void constraints() {
1241 1238
        Arc arc;
1242 1239
        Node node;
1243 1240
        visitor.start(node);
1244 1241
        visitor.reach(node);
1245 1242
        visitor.process(node);
1246 1243
        visitor.discover(arc);
1247 1244
        visitor.examine(arc);
1248 1245
      }
1249 1246
      _Visitor& visitor;
1250 1247
    };
1251 1248
  };
1252 1249
#endif
1253 1250

	
1254 1251
  /// \brief Default traits class of BfsVisit class.
1255 1252
  ///
1256 1253
  /// Default traits class of BfsVisit class.
1257 1254
  /// \tparam GR The type of the digraph the algorithm runs on.
1258 1255
  template<class GR>
1259 1256
  struct BfsVisitDefaultTraits {
1260 1257

	
1261 1258
    /// \brief The type of the digraph the algorithm runs on.
1262 1259
    typedef GR Digraph;
1263 1260

	
1264 1261
    /// \brief The type of the map that indicates which nodes are reached.
1265 1262
    ///
1266 1263
    /// The type of the map that indicates which nodes are reached.
1267
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1264
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1268 1265
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1269 1266

	
1270 1267
    /// \brief Instantiates a ReachedMap.
1271 1268
    ///
1272 1269
    /// This function instantiates a ReachedMap.
1273 1270
    /// \param digraph is the digraph, to which
1274 1271
    /// we would like to define the ReachedMap.
1275 1272
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1276 1273
      return new ReachedMap(digraph);
1277 1274
    }
1278 1275

	
1279 1276
  };
1280 1277

	
1281 1278
  /// \ingroup search
1282 1279
  ///
1283 1280
  /// \brief BFS algorithm class with visitor interface.
1284 1281
  ///
1285 1282
  /// This class provides an efficient implementation of the BFS algorithm
1286 1283
  /// with visitor interface.
1287 1284
  ///
1288 1285
  /// The BfsVisit class provides an alternative interface to the Bfs
1289 1286
  /// class. It works with callback mechanism, the BfsVisit object calls
1290 1287
  /// the member functions of the \c Visitor class on every BFS event.
1291 1288
  ///
1292 1289
  /// This interface of the BFS algorithm should be used in special cases
1293 1290
  /// when extra actions have to be performed in connection with certain
1294 1291
  /// events of the BFS algorithm. Otherwise consider to use Bfs or bfs()
1295 1292
  /// instead.
1296 1293
  ///
1297 1294
  /// \tparam GR The type of the digraph the algorithm runs on.
1298 1295
  /// The default type is \ref ListDigraph.
1299 1296
  /// The value of GR is not used directly by \ref BfsVisit,
1300 1297
  /// it is only passed to \ref BfsVisitDefaultTraits.
1301 1298
  /// \tparam VS The Visitor type that is used by the algorithm.
1302 1299
  /// \ref BfsVisitor "BfsVisitor<GR>" is an empty visitor, which
1303 1300
  /// does not observe the BFS events. If you want to observe the BFS
1304 1301
  /// events, you should implement your own visitor class.
1305 1302
  /// \tparam TR Traits class to set various data types used by the
1306 1303
  /// algorithm. The default traits class is
1307 1304
  /// \ref BfsVisitDefaultTraits "BfsVisitDefaultTraits<GR>".
1308 1305
  /// See \ref BfsVisitDefaultTraits for the documentation of
1309 1306
  /// a BFS visit traits class.
1310 1307
#ifdef DOXYGEN
1311 1308
  template <typename GR, typename VS, typename TR>
1312 1309
#else
1313 1310
  template <typename GR = ListDigraph,
1314 1311
            typename VS = BfsVisitor<GR>,
1315 1312
            typename TR = BfsVisitDefaultTraits<GR> >
... ...
@@ -1690,63 +1687,63 @@
1690 1687
    ///   b.start(t);
1691 1688
    ///\endcode
1692 1689
    bool run(Node s,Node t) {
1693 1690
      init();
1694 1691
      addSource(s);
1695 1692
      start(t);
1696 1693
      return reached(t);
1697 1694
    }
1698 1695

	
1699 1696
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1700 1697
    ///
1701 1698
    /// This method runs the %BFS algorithm in order to
1702 1699
    /// compute the shortest path to each node.
1703 1700
    ///
1704 1701
    /// The algorithm computes
1705 1702
    /// - the shortest path tree (forest),
1706 1703
    /// - the distance of each node from the root(s).
1707 1704
    ///
1708 1705
    /// \note <tt>b.run(s)</tt> is just a shortcut of the following code.
1709 1706
    ///\code
1710 1707
    ///  b.init();
1711 1708
    ///  for (NodeIt n(gr); n != INVALID; ++n) {
1712 1709
    ///    if (!b.reached(n)) {
1713 1710
    ///      b.addSource(n);
1714 1711
    ///      b.start();
1715 1712
    ///    }
1716 1713
    ///  }
1717 1714
    ///\endcode
1718 1715
    void run() {
1719 1716
      init();
1720 1717
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1721 1718
        if (!reached(it)) {
1722 1719
          addSource(it);
1723 1720
          start();
1724 1721
        }
1725 1722
      }
1726 1723
    }
1727 1724

	
1728 1725
    ///@}
1729 1726

	
1730 1727
    /// \name Query Functions
1731 1728
    /// The results of the BFS algorithm can be obtained using these
1732 1729
    /// functions.\n
1733 1730
    /// Either \ref run(Node) "run()" or \ref start() should be called
1734 1731
    /// before using them.
1735 1732

	
1736 1733
    ///@{
1737 1734

	
1738
    /// \brief Checks if a node is reached from the root(s).
1735
    /// \brief Checks if the given node is reached from the root(s).
1739 1736
    ///
1740 1737
    /// Returns \c true if \c v is reached from the root(s).
1741 1738
    ///
1742 1739
    /// \pre Either \ref run(Node) "run()" or \ref init()
1743 1740
    /// must be called before using this function.
1744 1741
    bool reached(Node v) const { return (*_reached)[v]; }
1745 1742

	
1746 1743
    ///@}
1747 1744

	
1748 1745
  };
1749 1746

	
1750 1747
} //END OF NAMESPACE LEMON
1751 1748

	
1752 1749
#endif
Show white space 96 line context
... ...
@@ -2,146 +2,147 @@
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2009
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_DFS_H
20 20
#define LEMON_DFS_H
21 21

	
22 22
///\ingroup search
23 23
///\file
24 24
///\brief DFS algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31 31
#include <lemon/path.h>
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  ///Default traits class of Dfs class.
36 36

	
37 37
  ///Default traits class of Dfs class.
38 38
  ///\tparam GR Digraph type.
39 39
  template<class GR>
40 40
  struct DfsDefaultTraits
41 41
  {
42 42
    ///The type of the digraph the algorithm runs on.
43 43
    typedef GR Digraph;
44 44

	
45 45
    ///\brief The type of the map that stores the predecessor
46 46
    ///arcs of the %DFS paths.
47 47
    ///
48 48
    ///The type of the map that stores the predecessor
49 49
    ///arcs of the %DFS paths.
50
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
50
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
51 51
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
52 52
    ///Instantiates a \c PredMap.
53 53

	
54 54
    ///This function instantiates a \ref PredMap.
55 55
    ///\param g is the digraph, to which we would like to define the
56 56
    ///\ref PredMap.
57 57
    static PredMap *createPredMap(const Digraph &g)
58 58
    {
59 59
      return new PredMap(g);
60 60
    }
61 61

	
62 62
    ///The type of the map that indicates which nodes are processed.
63 63

	
64 64
    ///The type of the map that indicates which nodes are processed.
65
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
65
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
66
    ///By default it is a NullMap.
66 67
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
67 68
    ///Instantiates a \c ProcessedMap.
68 69

	
69 70
    ///This function instantiates a \ref ProcessedMap.
70 71
    ///\param g is the digraph, to which
71 72
    ///we would like to define the \ref ProcessedMap.
72 73
#ifdef DOXYGEN
73 74
    static ProcessedMap *createProcessedMap(const Digraph &g)
74 75
#else
75 76
    static ProcessedMap *createProcessedMap(const Digraph &)
76 77
#endif
77 78
    {
78 79
      return new ProcessedMap();
79 80
    }
80 81

	
81 82
    ///The type of the map that indicates which nodes are reached.
82 83

	
83 84
    ///The type of the map that indicates which nodes are reached.
84
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
85 86
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
86 87
    ///Instantiates a \c ReachedMap.
87 88

	
88 89
    ///This function instantiates a \ref ReachedMap.
89 90
    ///\param g is the digraph, to which
90 91
    ///we would like to define the \ref ReachedMap.
91 92
    static ReachedMap *createReachedMap(const Digraph &g)
92 93
    {
93 94
      return new ReachedMap(g);
94 95
    }
95 96

	
96 97
    ///The type of the map that stores the distances of the nodes.
97 98

	
98 99
    ///The type of the map that stores the distances of the nodes.
99
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
100
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
100 101
    typedef typename Digraph::template NodeMap<int> DistMap;
101 102
    ///Instantiates a \c DistMap.
102 103

	
103 104
    ///This function instantiates a \ref DistMap.
104 105
    ///\param g is the digraph, to which we would like to define the
105 106
    ///\ref DistMap.
106 107
    static DistMap *createDistMap(const Digraph &g)
107 108
    {
108 109
      return new DistMap(g);
109 110
    }
110 111
  };
111 112

	
112 113
  ///%DFS algorithm class.
113 114

	
114 115
  ///\ingroup search
115 116
  ///This class provides an efficient implementation of the %DFS algorithm.
116 117
  ///
117 118
  ///There is also a \ref dfs() "function-type interface" for the DFS
118 119
  ///algorithm, which is convenient in the simplier cases and it can be
119 120
  ///used easier.
120 121
  ///
121 122
  ///\tparam GR The type of the digraph the algorithm runs on.
122 123
  ///The default type is \ref ListDigraph.
123 124
#ifdef DOXYGEN
124 125
  template <typename GR,
125 126
            typename TR>
126 127
#else
127 128
  template <typename GR=ListDigraph,
128 129
            typename TR=DfsDefaultTraits<GR> >
129 130
#endif
130 131
  class Dfs {
131 132
  public:
132 133

	
133 134
    ///The type of the digraph the algorithm runs on.
134 135
    typedef typename TR::Digraph Digraph;
135 136

	
136 137
    ///\brief The type of the map that stores the predecessor arcs of the
137 138
    ///DFS paths.
138 139
    typedef typename TR::PredMap PredMap;
139 140
    ///The type of the map that stores the distances of the nodes.
140 141
    typedef typename TR::DistMap DistMap;
141 142
    ///The type of the map that indicates which nodes are reached.
142 143
    typedef typename TR::ReachedMap ReachedMap;
143 144
    ///The type of the map that indicates which nodes are processed.
144 145
    typedef typename TR::ProcessedMap ProcessedMap;
145 146
    ///The type of the paths.
146 147
    typedef PredMapPath<Digraph, PredMap> Path;
147 148

	
... ...
@@ -179,157 +180,157 @@
179 180

	
180 181
    //Creates the maps if necessary.
181 182
    void create_maps()
182 183
    {
183 184
      if(!_pred) {
184 185
        local_pred = true;
185 186
        _pred = Traits::createPredMap(*G);
186 187
      }
187 188
      if(!_dist) {
188 189
        local_dist = true;
189 190
        _dist = Traits::createDistMap(*G);
190 191
      }
191 192
      if(!_reached) {
192 193
        local_reached = true;
193 194
        _reached = Traits::createReachedMap(*G);
194 195
      }
195 196
      if(!_processed) {
196 197
        local_processed = true;
197 198
        _processed = Traits::createProcessedMap(*G);
198 199
      }
199 200
    }
200 201

	
201 202
  protected:
202 203

	
203 204
    Dfs() {}
204 205

	
205 206
  public:
206 207

	
207 208
    typedef Dfs Create;
208 209

	
209 210
    ///\name Named Template Parameters
210 211

	
211 212
    ///@{
212 213

	
213 214
    template <class T>
214 215
    struct SetPredMapTraits : public Traits {
215 216
      typedef T PredMap;
216 217
      static PredMap *createPredMap(const Digraph &)
217 218
      {
218 219
        LEMON_ASSERT(false, "PredMap is not initialized");
219 220
        return 0; // ignore warnings
220 221
      }
221 222
    };
222 223
    ///\brief \ref named-templ-param "Named parameter" for setting
223 224
    ///\c PredMap type.
224 225
    ///
225 226
    ///\ref named-templ-param "Named parameter" for setting
226 227
    ///\c PredMap type.
227
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
228
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
228 229
    template <class T>
229 230
    struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > {
230 231
      typedef Dfs<Digraph, SetPredMapTraits<T> > Create;
231 232
    };
232 233

	
233 234
    template <class T>
234 235
    struct SetDistMapTraits : public Traits {
235 236
      typedef T DistMap;
236 237
      static DistMap *createDistMap(const Digraph &)
237 238
      {
238 239
        LEMON_ASSERT(false, "DistMap is not initialized");
239 240
        return 0; // ignore warnings
240 241
      }
241 242
    };
242 243
    ///\brief \ref named-templ-param "Named parameter" for setting
243 244
    ///\c DistMap type.
244 245
    ///
245 246
    ///\ref named-templ-param "Named parameter" for setting
246 247
    ///\c DistMap type.
247
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
248
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
248 249
    template <class T>
249 250
    struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > {
250 251
      typedef Dfs<Digraph, SetDistMapTraits<T> > Create;
251 252
    };
252 253

	
253 254
    template <class T>
254 255
    struct SetReachedMapTraits : public Traits {
255 256
      typedef T ReachedMap;
256 257
      static ReachedMap *createReachedMap(const Digraph &)
257 258
      {
258 259
        LEMON_ASSERT(false, "ReachedMap is not initialized");
259 260
        return 0; // ignore warnings
260 261
      }
261 262
    };
262 263
    ///\brief \ref named-templ-param "Named parameter" for setting
263 264
    ///\c ReachedMap type.
264 265
    ///
265 266
    ///\ref named-templ-param "Named parameter" for setting
266 267
    ///\c ReachedMap type.
267
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
268 269
    template <class T>
269 270
    struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > {
270 271
      typedef Dfs< Digraph, SetReachedMapTraits<T> > Create;
271 272
    };
272 273

	
273 274
    template <class T>
274 275
    struct SetProcessedMapTraits : public Traits {
275 276
      typedef T ProcessedMap;
276 277
      static ProcessedMap *createProcessedMap(const Digraph &)
277 278
      {
278 279
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
279 280
        return 0; // ignore warnings
280 281
      }
281 282
    };
282 283
    ///\brief \ref named-templ-param "Named parameter" for setting
283 284
    ///\c ProcessedMap type.
284 285
    ///
285 286
    ///\ref named-templ-param "Named parameter" for setting
286 287
    ///\c ProcessedMap type.
287
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
288
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
288 289
    template <class T>
289 290
    struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > {
290 291
      typedef Dfs< Digraph, SetProcessedMapTraits<T> > Create;
291 292
    };
292 293

	
293 294
    struct SetStandardProcessedMapTraits : public Traits {
294 295
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
295 296
      static ProcessedMap *createProcessedMap(const Digraph &g)
296 297
      {
297 298
        return new ProcessedMap(g);
298 299
      }
299 300
    };
300 301
    ///\brief \ref named-templ-param "Named parameter" for setting
301 302
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
302 303
    ///
303 304
    ///\ref named-templ-param "Named parameter" for setting
304 305
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
305 306
    ///If you don't set it explicitly, it will be automatically allocated.
306 307
    struct SetStandardProcessedMap :
307 308
      public Dfs< Digraph, SetStandardProcessedMapTraits > {
308 309
      typedef Dfs< Digraph, SetStandardProcessedMapTraits > Create;
309 310
    };
310 311

	
311 312
    ///@}
312 313

	
313 314
  public:
314 315

	
315 316
    ///Constructor.
316 317

	
317 318
    ///Constructor.
318 319
    ///\param g The digraph the algorithm runs on.
319 320
    Dfs(const Digraph &g) :
320 321
      G(&g),
321 322
      _pred(NULL), local_pred(false),
322 323
      _dist(NULL), local_dist(false),
323 324
      _reached(NULL), local_reached(false),
324 325
      _processed(NULL), local_processed(false)
325 326
    { }
326 327

	
327 328
    ///Destructor.
328 329
    ~Dfs()
329 330
    {
330 331
      if(local_pred) delete _pred;
331 332
      if(local_dist) delete _dist;
332 333
      if(local_reached) delete _reached;
333 334
      if(local_processed) delete _processed;
334 335
    }
335 336

	
... ...
@@ -624,485 +625,479 @@
624 625
    ///  d.start(t);
625 626
    ///\endcode
626 627
    bool run(Node s,Node t) {
627 628
      init();
628 629
      addSource(s);
629 630
      start(t);
630 631
      return reached(t);
631 632
    }
632 633

	
633 634
    ///Runs the algorithm to visit all nodes in the digraph.
634 635

	
635 636
    ///This method runs the %DFS algorithm in order to compute the
636 637
    ///%DFS path to each node.
637 638
    ///
638 639
    ///The algorithm computes
639 640
    ///- the %DFS tree (forest),
640 641
    ///- the distance of each node from the root(s) in the %DFS tree.
641 642
    ///
642 643
    ///\note <tt>d.run()</tt> is just a shortcut of the following code.
643 644
    ///\code
644 645
    ///  d.init();
645 646
    ///  for (NodeIt n(digraph); n != INVALID; ++n) {
646 647
    ///    if (!d.reached(n)) {
647 648
    ///      d.addSource(n);
648 649
    ///      d.start();
649 650
    ///    }
650 651
    ///  }
651 652
    ///\endcode
652 653
    void run() {
653 654
      init();
654 655
      for (NodeIt it(*G); it != INVALID; ++it) {
655 656
        if (!reached(it)) {
656 657
          addSource(it);
657 658
          start();
658 659
        }
659 660
      }
660 661
    }
661 662

	
662 663
    ///@}
663 664

	
664 665
    ///\name Query Functions
665 666
    ///The results of the DFS algorithm can be obtained using these
666 667
    ///functions.\n
667 668
    ///Either \ref run(Node) "run()" or \ref start() should be called
668 669
    ///before using them.
669 670

	
670 671
    ///@{
671 672

	
672
    ///The DFS path to a node.
673
    ///The DFS path to the given node.
673 674

	
674
    ///Returns the DFS path to a node.
675
    ///Returns the DFS path to the given node from the root(s).
675 676
    ///
676 677
    ///\warning \c t should be reached from the root(s).
677 678
    ///
678 679
    ///\pre Either \ref run(Node) "run()" or \ref init()
679 680
    ///must be called before using this function.
680 681
    Path path(Node t) const { return Path(*G, *_pred, t); }
681 682

	
682
    ///The distance of a node from the root(s).
683
    ///The distance of the given node from the root(s).
683 684

	
684
    ///Returns the distance of a node from the root(s).
685
    ///Returns the distance of the given node from the root(s).
685 686
    ///
686 687
    ///\warning If node \c v is not reached from the root(s), then
687 688
    ///the return value of this function is undefined.
688 689
    ///
689 690
    ///\pre Either \ref run(Node) "run()" or \ref init()
690 691
    ///must be called before using this function.
691 692
    int dist(Node v) const { return (*_dist)[v]; }
692 693

	
693
    ///Returns the 'previous arc' of the %DFS tree for a node.
694
    ///Returns the 'previous arc' of the %DFS tree for the given node.
694 695

	
695 696
    ///This function returns the 'previous arc' of the %DFS tree for the
696 697
    ///node \c v, i.e. it returns the last arc of a %DFS path from a
697 698
    ///root to \c v. It is \c INVALID if \c v is not reached from the
698 699
    ///root(s) or if \c v is a root.
699 700
    ///
700 701
    ///The %DFS tree used here is equal to the %DFS tree used in
701
    ///\ref predNode().
702
    ///\ref predNode() and \ref predMap().
702 703
    ///
703 704
    ///\pre Either \ref run(Node) "run()" or \ref init()
704 705
    ///must be called before using this function.
705 706
    Arc predArc(Node v) const { return (*_pred)[v];}
706 707

	
707
    ///Returns the 'previous node' of the %DFS tree.
708
    ///Returns the 'previous node' of the %DFS tree for the given node.
708 709

	
709 710
    ///This function returns the 'previous node' of the %DFS
710 711
    ///tree for the node \c v, i.e. it returns the last but one node
711
    ///from a %DFS path from a root to \c v. It is \c INVALID
712
    ///of a %DFS path from a root to \c v. It is \c INVALID
712 713
    ///if \c v is not reached from the root(s) or if \c v is a root.
713 714
    ///
714 715
    ///The %DFS tree used here is equal to the %DFS tree used in
715
    ///\ref predArc().
716
    ///\ref predArc() and \ref predMap().
716 717
    ///
717 718
    ///\pre Either \ref run(Node) "run()" or \ref init()
718 719
    ///must be called before using this function.
719 720
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
720 721
                                  G->source((*_pred)[v]); }
721 722

	
722 723
    ///\brief Returns a const reference to the node map that stores the
723 724
    ///distances of the nodes.
724 725
    ///
725 726
    ///Returns a const reference to the node map that stores the
726 727
    ///distances of the nodes calculated by the algorithm.
727 728
    ///
728 729
    ///\pre Either \ref run(Node) "run()" or \ref init()
729 730
    ///must be called before using this function.
730 731
    const DistMap &distMap() const { return *_dist;}
731 732

	
732 733
    ///\brief Returns a const reference to the node map that stores the
733 734
    ///predecessor arcs.
734 735
    ///
735 736
    ///Returns a const reference to the node map that stores the predecessor
736
    ///arcs, which form the DFS tree.
737
    ///arcs, which form the DFS tree (forest).
737 738
    ///
738 739
    ///\pre Either \ref run(Node) "run()" or \ref init()
739 740
    ///must be called before using this function.
740 741
    const PredMap &predMap() const { return *_pred;}
741 742

	
742
    ///Checks if a node is reached from the root(s).
743
    ///Checks if the given node. node is reached from the root(s).
743 744

	
744 745
    ///Returns \c true if \c v is reached from the root(s).
745 746
    ///
746 747
    ///\pre Either \ref run(Node) "run()" or \ref init()
747 748
    ///must be called before using this function.
748 749
    bool reached(Node v) const { return (*_reached)[v]; }
749 750

	
750 751
    ///@}
751 752
  };
752 753

	
753 754
  ///Default traits class of dfs() function.
754 755

	
755 756
  ///Default traits class of dfs() function.
756 757
  ///\tparam GR Digraph type.
757 758
  template<class GR>
758 759
  struct DfsWizardDefaultTraits
759 760
  {
760 761
    ///The type of the digraph the algorithm runs on.
761 762
    typedef GR Digraph;
762 763

	
763 764
    ///\brief The type of the map that stores the predecessor
764 765
    ///arcs of the %DFS paths.
765 766
    ///
766 767
    ///The type of the map that stores the predecessor
767 768
    ///arcs of the %DFS paths.
768
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
769
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
769 770
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
770 771
    ///Instantiates a PredMap.
771 772

	
772 773
    ///This function instantiates a PredMap.
773 774
    ///\param g is the digraph, to which we would like to define the
774 775
    ///PredMap.
775 776
    static PredMap *createPredMap(const Digraph &g)
776 777
    {
777 778
      return new PredMap(g);
778 779
    }
779 780

	
780 781
    ///The type of the map that indicates which nodes are processed.
781 782

	
782 783
    ///The type of the map that indicates which nodes are processed.
783
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
784
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
784 785
    ///By default it is a NullMap.
785 786
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
786 787
    ///Instantiates a ProcessedMap.
787 788

	
788 789
    ///This function instantiates a ProcessedMap.
789 790
    ///\param g is the digraph, to which
790 791
    ///we would like to define the ProcessedMap.
791 792
#ifdef DOXYGEN
792 793
    static ProcessedMap *createProcessedMap(const Digraph &g)
793 794
#else
794 795
    static ProcessedMap *createProcessedMap(const Digraph &)
795 796
#endif
796 797
    {
797 798
      return new ProcessedMap();
798 799
    }
799 800

	
800 801
    ///The type of the map that indicates which nodes are reached.
801 802

	
802 803
    ///The type of the map that indicates which nodes are reached.
803
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804
    ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
804 805
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
805 806
    ///Instantiates a ReachedMap.
806 807

	
807 808
    ///This function instantiates a ReachedMap.
808 809
    ///\param g is the digraph, to which
809 810
    ///we would like to define the ReachedMap.
810 811
    static ReachedMap *createReachedMap(const Digraph &g)
811 812
    {
812 813
      return new ReachedMap(g);
813 814
    }
814 815

	
815 816
    ///The type of the map that stores the distances of the nodes.
816 817

	
817 818
    ///The type of the map that stores the distances of the nodes.
818
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
819
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
819 820
    typedef typename Digraph::template NodeMap<int> DistMap;
820 821
    ///Instantiates a DistMap.
821 822

	
822 823
    ///This function instantiates a DistMap.
823 824
    ///\param g is the digraph, to which we would like to define
824 825
    ///the DistMap
825 826
    static DistMap *createDistMap(const Digraph &g)
826 827
    {
827 828
      return new DistMap(g);
828 829
    }
829 830

	
830 831
    ///The type of the DFS paths.
831 832

	
832 833
    ///The type of the DFS paths.
833
    ///It must meet the \ref concepts::Path "Path" concept.
834
    ///It must conform to the \ref concepts::Path "Path" concept.
834 835
    typedef lemon::Path<Digraph> Path;
835 836
  };
836 837

	
837 838
  /// Default traits class used by DfsWizard
838 839

	
839
  /// To make it easier to use Dfs algorithm
840
  /// we have created a wizard class.
841
  /// This \ref DfsWizard class needs default traits,
842
  /// as well as the \ref Dfs class.
843
  /// The \ref DfsWizardBase is a class to be the default traits of the
844
  /// \ref DfsWizard class.
840
  /// Default traits class used by DfsWizard.
841
  /// \tparam GR The type of the digraph.
845 842
  template<class GR>
846 843
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
847 844
  {
848 845

	
849 846
    typedef DfsWizardDefaultTraits<GR> Base;
850 847
  protected:
851 848
    //The type of the nodes in the digraph.
852 849
    typedef typename Base::Digraph::Node Node;
853 850

	
854 851
    //Pointer to the digraph the algorithm runs on.
855 852
    void *_g;
856 853
    //Pointer to the map of reached nodes.
857 854
    void *_reached;
858 855
    //Pointer to the map of processed nodes.
859 856
    void *_processed;
860 857
    //Pointer to the map of predecessors arcs.
861 858
    void *_pred;
862 859
    //Pointer to the map of distances.
863 860
    void *_dist;
864 861
    //Pointer to the DFS path to the target node.
865 862
    void *_path;
866 863
    //Pointer to the distance of the target node.
867 864
    int *_di;
868 865

	
869 866
    public:
870 867
    /// Constructor.
871 868

	
872
    /// This constructor does not require parameters, therefore it initiates
869
    /// This constructor does not require parameters, it initiates
873 870
    /// all of the attributes to \c 0.
874 871
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
875 872
                      _dist(0), _path(0), _di(0) {}
876 873

	
877 874
    /// Constructor.
878 875

	
879 876
    /// This constructor requires one parameter,
880 877
    /// others are initiated to \c 0.
881 878
    /// \param g The digraph the algorithm runs on.
882 879
    DfsWizardBase(const GR &g) :
883 880
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
884 881
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
885 882

	
886 883
  };
887 884

	
888 885
  /// Auxiliary class for the function-type interface of DFS algorithm.
889 886

	
890 887
  /// This auxiliary class is created to implement the
891 888
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
892 889
  /// It does not have own \ref run(Node) "run()" method, it uses the
893 890
  /// functions and features of the plain \ref Dfs.
894 891
  ///
895 892
  /// This class should only be used through the \ref dfs() function,
896 893
  /// which makes it easier to use the algorithm.
897 894
  template<class TR>
898 895
  class DfsWizard : public TR
899 896
  {
900 897
    typedef TR Base;
901 898

	
902
    ///The type of the digraph the algorithm runs on.
903 899
    typedef typename TR::Digraph Digraph;
904 900

	
905 901
    typedef typename Digraph::Node Node;
906 902
    typedef typename Digraph::NodeIt NodeIt;
907 903
    typedef typename Digraph::Arc Arc;
908 904
    typedef typename Digraph::OutArcIt OutArcIt;
909 905

	
910
    ///\brief The type of the map that stores the predecessor
911
    ///arcs of the DFS paths.
912 906
    typedef typename TR::PredMap PredMap;
913
    ///\brief The type of the map that stores the distances of the nodes.
914 907
    typedef typename TR::DistMap DistMap;
915
    ///\brief The type of the map that indicates which nodes are reached.
916 908
    typedef typename TR::ReachedMap ReachedMap;
917
    ///\brief The type of the map that indicates which nodes are processed.
918 909
    typedef typename TR::ProcessedMap ProcessedMap;
919
    ///The type of the DFS paths
920 910
    typedef typename TR::Path Path;
921 911

	
922 912
  public:
923 913

	
924 914
    /// Constructor.
925 915
    DfsWizard() : TR() {}
926 916

	
927 917
    /// Constructor that requires parameters.
928 918

	
929 919
    /// Constructor that requires parameters.
930 920
    /// These parameters will be the default values for the traits class.
931 921
    /// \param g The digraph the algorithm runs on.
932 922
    DfsWizard(const Digraph &g) :
933 923
      TR(g) {}
934 924

	
935 925
    ///Copy constructor
936 926
    DfsWizard(const TR &b) : TR(b) {}
937 927

	
938 928
    ~DfsWizard() {}
939 929

	
940 930
    ///Runs DFS algorithm from the given source node.
941 931

	
942 932
    ///This method runs DFS algorithm from node \c s
943 933
    ///in order to compute the DFS path to each node.
944 934
    void run(Node s)
945 935
    {
946 936
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
947 937
      if (Base::_pred)
948 938
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
949 939
      if (Base::_dist)
950 940
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
951 941
      if (Base::_reached)
952 942
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
953 943
      if (Base::_processed)
954 944
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
955 945
      if (s!=INVALID)
956 946
        alg.run(s);
957 947
      else
958 948
        alg.run();
959 949
    }
960 950

	
961 951
    ///Finds the DFS path between \c s and \c t.
962 952

	
963 953
    ///This method runs DFS algorithm from node \c s
964 954
    ///in order to compute the DFS path to node \c t
965 955
    ///(it stops searching when \c t is processed).
966 956
    ///
967 957
    ///\return \c true if \c t is reachable form \c s.
968 958
    bool run(Node s, Node t)
969 959
    {
970 960
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
971 961
      if (Base::_pred)
972 962
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
973 963
      if (Base::_dist)
974 964
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
975 965
      if (Base::_reached)
976 966
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
977 967
      if (Base::_processed)
978 968
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
979 969
      alg.run(s,t);
980 970
      if (Base::_path)
981 971
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
982 972
      if (Base::_di)
983 973
        *Base::_di = alg.dist(t);
984 974
      return alg.reached(t);
985 975
      }
986 976

	
987 977
    ///Runs DFS algorithm to visit all nodes in the digraph.
988 978

	
989 979
    ///This method runs DFS algorithm in order to compute
990 980
    ///the DFS path to each node.
991 981
    void run()
992 982
    {
993 983
      run(INVALID);
994 984
    }
995 985

	
996 986
    template<class T>
997 987
    struct SetPredMapBase : public Base {
998 988
      typedef T PredMap;
999 989
      static PredMap *createPredMap(const Digraph &) { return 0; };
1000 990
      SetPredMapBase(const TR &b) : TR(b) {}
1001 991
    };
1002
    ///\brief \ref named-func-param "Named parameter"
1003
    ///for setting PredMap object.
992

	
993
    ///\brief \ref named-templ-param "Named parameter" for setting
994
    ///the predecessor map.
1004 995
    ///
1005
    ///\ref named-func-param "Named parameter"
1006
    ///for setting PredMap object.
996
    ///\ref named-templ-param "Named parameter" function for setting
997
    ///the map that stores the predecessor arcs of the nodes.
1007 998
    template<class T>
1008 999
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1009 1000
    {
1010 1001
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1011 1002
      return DfsWizard<SetPredMapBase<T> >(*this);
1012 1003
    }
1013 1004

	
1014 1005
    template<class T>
1015 1006
    struct SetReachedMapBase : public Base {
1016 1007
      typedef T ReachedMap;
1017 1008
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1018 1009
      SetReachedMapBase(const TR &b) : TR(b) {}
1019 1010
    };
1020
    ///\brief \ref named-func-param "Named parameter"
1021
    ///for setting ReachedMap object.
1011

	
1012
    ///\brief \ref named-templ-param "Named parameter" for setting
1013
    ///the reached map.
1022 1014
    ///
1023
    /// \ref named-func-param "Named parameter"
1024
    ///for setting ReachedMap object.
1015
    ///\ref named-templ-param "Named parameter" function for setting
1016
    ///the map that indicates which nodes are reached.
1025 1017
    template<class T>
1026 1018
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1027 1019
    {
1028 1020
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1029 1021
      return DfsWizard<SetReachedMapBase<T> >(*this);
1030 1022
    }
1031 1023

	
1032 1024
    template<class T>
1033 1025
    struct SetDistMapBase : public Base {
1034 1026
      typedef T DistMap;
1035 1027
      static DistMap *createDistMap(const Digraph &) { return 0; };
1036 1028
      SetDistMapBase(const TR &b) : TR(b) {}
1037 1029
    };
1038
    ///\brief \ref named-func-param "Named parameter"
1039
    ///for setting DistMap object.
1030

	
1031
    ///\brief \ref named-templ-param "Named parameter" for setting
1032
    ///the distance map.
1040 1033
    ///
1041
    /// \ref named-func-param "Named parameter"
1042
    ///for setting DistMap object.
1034
    ///\ref named-templ-param "Named parameter" function for setting
1035
    ///the map that stores the distances of the nodes calculated
1036
    ///by the algorithm.
1043 1037
    template<class T>
1044 1038
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1045 1039
    {
1046 1040
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1047 1041
      return DfsWizard<SetDistMapBase<T> >(*this);
1048 1042
    }
1049 1043

	
1050 1044
    template<class T>
1051 1045
    struct SetProcessedMapBase : public Base {
1052 1046
      typedef T ProcessedMap;
1053 1047
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1054 1048
      SetProcessedMapBase(const TR &b) : TR(b) {}
1055 1049
    };
1056
    ///\brief \ref named-func-param "Named parameter"
1057
    ///for setting ProcessedMap object.
1050

	
1051
    ///\brief \ref named-func-param "Named parameter" for setting
1052
    ///the processed map.
1058 1053
    ///
1059
    /// \ref named-func-param "Named parameter"
1060
    ///for setting ProcessedMap object.
1054
    ///\ref named-templ-param "Named parameter" function for setting
1055
    ///the map that indicates which nodes are processed.
1061 1056
    template<class T>
1062 1057
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1063 1058
    {
1064 1059
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1065 1060
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1066 1061
    }
1067 1062

	
1068 1063
    template<class T>
1069 1064
    struct SetPathBase : public Base {
1070 1065
      typedef T Path;
1071 1066
      SetPathBase(const TR &b) : TR(b) {}
1072 1067
    };
1073 1068
    ///\brief \ref named-func-param "Named parameter"
1074 1069
    ///for getting the DFS path to the target node.
1075 1070
    ///
1076 1071
    ///\ref named-func-param "Named parameter"
1077 1072
    ///for getting the DFS path to the target node.
1078 1073
    template<class T>
1079 1074
    DfsWizard<SetPathBase<T> > path(const T &t)
1080 1075
    {
1081 1076
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1082 1077
      return DfsWizard<SetPathBase<T> >(*this);
1083 1078
    }
1084 1079

	
1085 1080
    ///\brief \ref named-func-param "Named parameter"
1086 1081
    ///for getting the distance of the target node.
1087 1082
    ///
1088 1083
    ///\ref named-func-param "Named parameter"
1089 1084
    ///for getting the distance of the target node.
1090 1085
    DfsWizard dist(const int &d)
1091 1086
    {
1092 1087
      Base::_di=const_cast<int*>(&d);
1093 1088
      return *this;
1094 1089
    }
1095 1090

	
1096 1091
  };
1097 1092

	
1098 1093
  ///Function-type interface for DFS algorithm.
1099 1094

	
1100 1095
  ///\ingroup search
1101 1096
  ///Function-type interface for DFS algorithm.
1102 1097
  ///
1103 1098
  ///This function also has several \ref named-func-param "named parameters",
1104 1099
  ///they are declared as the members of class \ref DfsWizard.
1105 1100
  ///The following examples show how to use these parameters.
1106 1101
  ///\code
1107 1102
  ///  // Compute the DFS tree
1108 1103
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
... ...
@@ -1163,97 +1158,97 @@
1163 1158
    /// This function is called when the DFS steps back on an arc.
1164 1159
    void backtrack(const Arc& arc) {}
1165 1160
  };
1166 1161
#else
1167 1162
  template <typename GR>
1168 1163
  struct DfsVisitor {
1169 1164
    typedef GR Digraph;
1170 1165
    typedef typename Digraph::Arc Arc;
1171 1166
    typedef typename Digraph::Node Node;
1172 1167
    void start(const Node&) {}
1173 1168
    void stop(const Node&) {}
1174 1169
    void reach(const Node&) {}
1175 1170
    void discover(const Arc&) {}
1176 1171
    void examine(const Arc&) {}
1177 1172
    void leave(const Node&) {}
1178 1173
    void backtrack(const Arc&) {}
1179 1174

	
1180 1175
    template <typename _Visitor>
1181 1176
    struct Constraints {
1182 1177
      void constraints() {
1183 1178
        Arc arc;
1184 1179
        Node node;
1185 1180
        visitor.start(node);
1186 1181
        visitor.stop(arc);
1187 1182
        visitor.reach(node);
1188 1183
        visitor.discover(arc);
1189 1184
        visitor.examine(arc);
1190 1185
        visitor.leave(node);
1191 1186
        visitor.backtrack(arc);
1192 1187
      }
1193 1188
      _Visitor& visitor;
1194 1189
    };
1195 1190
  };
1196 1191
#endif
1197 1192

	
1198 1193
  /// \brief Default traits class of DfsVisit class.
1199 1194
  ///
1200 1195
  /// Default traits class of DfsVisit class.
1201 1196
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1202 1197
  template<class GR>
1203 1198
  struct DfsVisitDefaultTraits {
1204 1199

	
1205 1200
    /// \brief The type of the digraph the algorithm runs on.
1206 1201
    typedef GR Digraph;
1207 1202

	
1208 1203
    /// \brief The type of the map that indicates which nodes are reached.
1209 1204
    ///
1210 1205
    /// The type of the map that indicates which nodes are reached.
1211
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1206
    /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1212 1207
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1213 1208

	
1214 1209
    /// \brief Instantiates a ReachedMap.
1215 1210
    ///
1216 1211
    /// This function instantiates a ReachedMap.
1217 1212
    /// \param digraph is the digraph, to which
1218 1213
    /// we would like to define the ReachedMap.
1219 1214
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1220 1215
      return new ReachedMap(digraph);
1221 1216
    }
1222 1217

	
1223 1218
  };
1224 1219

	
1225 1220
  /// \ingroup search
1226 1221
  ///
1227 1222
  /// \brief DFS algorithm class with visitor interface.
1228 1223
  ///
1229 1224
  /// This class provides an efficient implementation of the DFS algorithm
1230 1225
  /// with visitor interface.
1231 1226
  ///
1232 1227
  /// The DfsVisit class provides an alternative interface to the Dfs
1233 1228
  /// class. It works with callback mechanism, the DfsVisit object calls
1234 1229
  /// the member functions of the \c Visitor class on every DFS event.
1235 1230
  ///
1236 1231
  /// This interface of the DFS algorithm should be used in special cases
1237 1232
  /// when extra actions have to be performed in connection with certain
1238 1233
  /// events of the DFS algorithm. Otherwise consider to use Dfs or dfs()
1239 1234
  /// instead.
1240 1235
  ///
1241 1236
  /// \tparam GR The type of the digraph the algorithm runs on.
1242 1237
  /// The default type is \ref ListDigraph.
1243 1238
  /// The value of GR is not used directly by \ref DfsVisit,
1244 1239
  /// it is only passed to \ref DfsVisitDefaultTraits.
1245 1240
  /// \tparam VS The Visitor type that is used by the algorithm.
1246 1241
  /// \ref DfsVisitor "DfsVisitor<GR>" is an empty visitor, which
1247 1242
  /// does not observe the DFS events. If you want to observe the DFS
1248 1243
  /// events, you should implement your own visitor class.
1249 1244
  /// \tparam TR Traits class to set various data types used by the
1250 1245
  /// algorithm. The default traits class is
1251 1246
  /// \ref DfsVisitDefaultTraits "DfsVisitDefaultTraits<GR>".
1252 1247
  /// See \ref DfsVisitDefaultTraits for the documentation of
1253 1248
  /// a DFS visit traits class.
1254 1249
#ifdef DOXYGEN
1255 1250
  template <typename GR, typename VS, typename TR>
1256 1251
#else
1257 1252
  template <typename GR = ListDigraph,
1258 1253
            typename VS = DfsVisitor<GR>,
1259 1254
            typename TR = DfsVisitDefaultTraits<GR> >
... ...
@@ -1575,63 +1570,63 @@
1575 1570
    ///   d.start(t);
1576 1571
    ///\endcode
1577 1572
    bool run(Node s,Node t) {
1578 1573
      init();
1579 1574
      addSource(s);
1580 1575
      start(t);
1581 1576
      return reached(t);
1582 1577
    }
1583 1578

	
1584 1579
    /// \brief Runs the algorithm to visit all nodes in the digraph.
1585 1580

	
1586 1581
    /// This method runs the %DFS algorithm in order to
1587 1582
    /// compute the %DFS path to each node.
1588 1583
    ///
1589 1584
    /// The algorithm computes
1590 1585
    /// - the %DFS tree (forest),
1591 1586
    /// - the distance of each node from the root(s) in the %DFS tree.
1592 1587
    ///
1593 1588
    /// \note <tt>d.run()</tt> is just a shortcut of the following code.
1594 1589
    ///\code
1595 1590
    ///   d.init();
1596 1591
    ///   for (NodeIt n(digraph); n != INVALID; ++n) {
1597 1592
    ///     if (!d.reached(n)) {
1598 1593
    ///       d.addSource(n);
1599 1594
    ///       d.start();
1600 1595
    ///     }
1601 1596
    ///   }
1602 1597
    ///\endcode
1603 1598
    void run() {
1604 1599
      init();
1605 1600
      for (NodeIt it(*_digraph); it != INVALID; ++it) {
1606 1601
        if (!reached(it)) {
1607 1602
          addSource(it);
1608 1603
          start();
1609 1604
        }
1610 1605
      }
1611 1606
    }
1612 1607

	
1613 1608
    ///@}
1614 1609

	
1615 1610
    /// \name Query Functions
1616 1611
    /// The results of the DFS algorithm can be obtained using these
1617 1612
    /// functions.\n
1618 1613
    /// Either \ref run(Node) "run()" or \ref start() should be called
1619 1614
    /// before using them.
1620 1615

	
1621 1616
    ///@{
1622 1617

	
1623
    /// \brief Checks if a node is reached from the root(s).
1618
    /// \brief Checks if the given node is reached from the root(s).
1624 1619
    ///
1625 1620
    /// Returns \c true if \c v is reached from the root(s).
1626 1621
    ///
1627 1622
    /// \pre Either \ref run(Node) "run()" or \ref init()
1628 1623
    /// must be called before using this function.
1629 1624
    bool reached(Node v) const { return (*_reached)[v]; }
1630 1625

	
1631 1626
    ///@}
1632 1627

	
1633 1628
  };
1634 1629

	
1635 1630
} //END OF NAMESPACE LEMON
1636 1631

	
1637 1632
#endif
Show white space 96 line context
... ...
@@ -25,228 +25,232 @@
25 25

	
26 26
#include <limits>
27 27
#include <lemon/list_graph.h>
28 28
#include <lemon/bin_heap.h>
29 29
#include <lemon/bits/path_dump.h>
30 30
#include <lemon/core.h>
31 31
#include <lemon/error.h>
32 32
#include <lemon/maps.h>
33 33
#include <lemon/path.h>
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Default operation traits for the Dijkstra algorithm class.
38 38
  ///
39 39
  /// This operation traits class defines all computational operations and
40 40
  /// constants which are used in the Dijkstra algorithm.
41 41
  template <typename V>
42 42
  struct DijkstraDefaultOperationTraits {
43 43
    /// \e
44 44
    typedef V Value;
45 45
    /// \brief Gives back the zero value of the type.
46 46
    static Value zero() {
47 47
      return static_cast<Value>(0);
48 48
    }
49 49
    /// \brief Gives back the sum of the given two elements.
50 50
    static Value plus(const Value& left, const Value& right) {
51 51
      return left + right;
52 52
    }
53 53
    /// \brief Gives back true only if the first value is less than the second.
54 54
    static bool less(const Value& left, const Value& right) {
55 55
      return left < right;
56 56
    }
57 57
  };
58 58

	
59 59
  ///Default traits class of Dijkstra class.
60 60

	
61 61
  ///Default traits class of Dijkstra class.
62 62
  ///\tparam GR The type of the digraph.
63 63
  ///\tparam LEN The type of the length map.
64 64
  template<typename GR, typename LEN>
65 65
  struct DijkstraDefaultTraits
66 66
  {
67 67
    ///The type of the digraph the algorithm runs on.
68 68
    typedef GR Digraph;
69 69

	
70 70
    ///The type of the map that stores the arc lengths.
71 71

	
72 72
    ///The type of the map that stores the arc lengths.
73
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
73
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
74 74
    typedef LEN LengthMap;
75
    ///The type of the length of the arcs.
75
    ///The type of the arc lengths.
76 76
    typedef typename LEN::Value Value;
77 77

	
78 78
    /// Operation traits for %Dijkstra algorithm.
79 79

	
80 80
    /// This class defines the operations that are used in the algorithm.
81 81
    /// \see DijkstraDefaultOperationTraits
82 82
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
83 83

	
84 84
    /// The cross reference type used by the heap.
85 85

	
86 86
    /// The cross reference type used by the heap.
87 87
    /// Usually it is \c Digraph::NodeMap<int>.
88 88
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
89 89
    ///Instantiates a \c HeapCrossRef.
90 90

	
91 91
    ///This function instantiates a \ref HeapCrossRef.
92 92
    /// \param g is the digraph, to which we would like to define the
93 93
    /// \ref HeapCrossRef.
94 94
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
95 95
    {
96 96
      return new HeapCrossRef(g);
97 97
    }
98 98

	
99 99
    ///The heap type used by the %Dijkstra algorithm.
100 100

	
101 101
    ///The heap type used by the Dijkstra algorithm.
102 102
    ///
103 103
    ///\sa BinHeap
104 104
    ///\sa Dijkstra
105 105
    typedef BinHeap<typename LEN::Value, HeapCrossRef, std::less<Value> > Heap;
106 106
    ///Instantiates a \c Heap.
107 107

	
108 108
    ///This function instantiates a \ref Heap.
109 109
    static Heap *createHeap(HeapCrossRef& r)
110 110
    {
111 111
      return new Heap(r);
112 112
    }
113 113

	
114 114
    ///\brief The type of the map that stores the predecessor
115 115
    ///arcs of the shortest paths.
116 116
    ///
117 117
    ///The type of the map that stores the predecessor
118 118
    ///arcs of the shortest paths.
119
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
119
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
120 120
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
121 121
    ///Instantiates a \c PredMap.
122 122

	
123 123
    ///This function instantiates a \ref PredMap.
124 124
    ///\param g is the digraph, to which we would like to define the
125 125
    ///\ref PredMap.
126 126
    static PredMap *createPredMap(const Digraph &g)
127 127
    {
128 128
      return new PredMap(g);
129 129
    }
130 130

	
131 131
    ///The type of the map that indicates which nodes are processed.
132 132

	
133 133
    ///The type of the map that indicates which nodes are processed.
134
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
134
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
135 135
    ///By default it is a NullMap.
136 136
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
137 137
    ///Instantiates a \c ProcessedMap.
138 138

	
139 139
    ///This function instantiates a \ref ProcessedMap.
140 140
    ///\param g is the digraph, to which
141 141
    ///we would like to define the \ref ProcessedMap.
142 142
#ifdef DOXYGEN
143 143
    static ProcessedMap *createProcessedMap(const Digraph &g)
144 144
#else
145 145
    static ProcessedMap *createProcessedMap(const Digraph &)
146 146
#endif
147 147
    {
148 148
      return new ProcessedMap();
149 149
    }
150 150

	
151 151
    ///The type of the map that stores the distances of the nodes.
152 152

	
153 153
    ///The type of the map that stores the distances of the nodes.
154
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
154
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
155 155
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
156 156
    ///Instantiates a \c DistMap.
157 157

	
158 158
    ///This function instantiates a \ref DistMap.
159 159
    ///\param g is the digraph, to which we would like to define
160 160
    ///the \ref DistMap.
161 161
    static DistMap *createDistMap(const Digraph &g)
162 162
    {
163 163
      return new DistMap(g);
164 164
    }
165 165
  };
166 166

	
167 167
  ///%Dijkstra algorithm class.
168 168

	
169 169
  /// \ingroup shortest_path
170 170
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
171 171
  ///
172
  ///The %Dijkstra algorithm solves the single-source shortest path problem
173
  ///when all arc lengths are non-negative. If there are negative lengths,
174
  ///the BellmanFord algorithm should be used instead.
175
  ///
172 176
  ///The arc lengths are passed to the algorithm using a
173 177
  ///\ref concepts::ReadMap "ReadMap",
174 178
  ///so it is easy to change it to any kind of length.
175 179
  ///The type of the length is determined by the
176 180
  ///\ref concepts::ReadMap::Value "Value" of the length map.
177 181
  ///It is also possible to change the underlying priority heap.
178 182
  ///
179 183
  ///There is also a \ref dijkstra() "function-type interface" for the
180 184
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
181 185
  ///it can be used easier.
182 186
  ///
183 187
  ///\tparam GR The type of the digraph the algorithm runs on.
184 188
  ///The default type is \ref ListDigraph.
185 189
  ///\tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
186 190
  ///the lengths of the arcs.
187 191
  ///It is read once for each arc, so the map may involve in
188 192
  ///relatively time consuming process to compute the arc lengths if
189 193
  ///it is necessary. The default map type is \ref
190 194
  ///concepts::Digraph::ArcMap "GR::ArcMap<int>".
191 195
#ifdef DOXYGEN
192 196
  template <typename GR, typename LEN, typename TR>
193 197
#else
194 198
  template <typename GR=ListDigraph,
195 199
            typename LEN=typename GR::template ArcMap<int>,
196 200
            typename TR=DijkstraDefaultTraits<GR,LEN> >
197 201
#endif
198 202
  class Dijkstra {
199 203
  public:
200 204

	
201 205
    ///The type of the digraph the algorithm runs on.
202 206
    typedef typename TR::Digraph Digraph;
203 207

	
204
    ///The type of the length of the arcs.
208
    ///The type of the arc lengths.
205 209
    typedef typename TR::LengthMap::Value Value;
206 210
    ///The type of the map that stores the arc lengths.
207 211
    typedef typename TR::LengthMap LengthMap;
208 212
    ///\brief The type of the map that stores the predecessor arcs of the
209 213
    ///shortest paths.
210 214
    typedef typename TR::PredMap PredMap;
211 215
    ///The type of the map that stores the distances of the nodes.
212 216
    typedef typename TR::DistMap DistMap;
213 217
    ///The type of the map that indicates which nodes are processed.
214 218
    typedef typename TR::ProcessedMap ProcessedMap;
215 219
    ///The type of the paths.
216 220
    typedef PredMapPath<Digraph, PredMap> Path;
217 221
    ///The cross reference type used for the current heap.
218 222
    typedef typename TR::HeapCrossRef HeapCrossRef;
219 223
    ///The heap type used by the algorithm.
220 224
    typedef typename TR::Heap Heap;
221 225
    ///\brief The \ref DijkstraDefaultOperationTraits "operation traits class"
222 226
    ///of the algorithm.
223 227
    typedef typename TR::OperationTraits OperationTraits;
224 228

	
225 229
    ///The \ref DijkstraDefaultTraits "traits class" of the algorithm.
226 230
    typedef TR Traits;
227 231

	
228 232
  private:
229 233

	
230 234
    typedef typename Digraph::Node Node;
231 235
    typedef typename Digraph::NodeIt NodeIt;
232 236
    typedef typename Digraph::Arc Arc;
233 237
    typedef typename Digraph::OutArcIt OutArcIt;
234 238

	
235 239
    //Pointer to the underlying digraph.
236 240
    const Digraph *G;
237 241
    //Pointer to the length map.
238 242
    const LengthMap *_length;
239 243
    //Pointer to the map of predecessors arcs.
240 244
    PredMap *_pred;
241 245
    //Indicates if _pred is locally allocated (true) or not.
242 246
    bool local_pred;
243 247
    //Pointer to the map of distances.
244 248
    DistMap *_dist;
245 249
    //Indicates if _dist is locally allocated (true) or not.
246 250
    bool local_dist;
247 251
    //Pointer to the map of processed status of the nodes.
248 252
    ProcessedMap *_processed;
249 253
    //Indicates if _processed is locally allocated (true) or not.
250 254
    bool local_processed;
251 255
    //Pointer to the heap cross references.
252 256
    HeapCrossRef *_heap_cross_ref;
... ...
@@ -259,235 +263,236 @@
259 263

	
260 264
    //Creates the maps if necessary.
261 265
    void create_maps()
262 266
    {
263 267
      if(!_pred) {
264 268
        local_pred = true;
265 269
        _pred = Traits::createPredMap(*G);
266 270
      }
267 271
      if(!_dist) {
268 272
        local_dist = true;
269 273
        _dist = Traits::createDistMap(*G);
270 274
      }
271 275
      if(!_processed) {
272 276
        local_processed = true;
273 277
        _processed = Traits::createProcessedMap(*G);
274 278
      }
275 279
      if (!_heap_cross_ref) {
276 280
        local_heap_cross_ref = true;
277 281
        _heap_cross_ref = Traits::createHeapCrossRef(*G);
278 282
      }
279 283
      if (!_heap) {
280 284
        local_heap = true;
281 285
        _heap = Traits::createHeap(*_heap_cross_ref);
282 286
      }
283 287
    }
284 288

	
285 289
  public:
286 290

	
287 291
    typedef Dijkstra Create;
288 292

	
289 293
    ///\name Named Template Parameters
290 294

	
291 295
    ///@{
292 296

	
293 297
    template <class T>
294 298
    struct SetPredMapTraits : public Traits {
295 299
      typedef T PredMap;
296 300
      static PredMap *createPredMap(const Digraph &)
297 301
      {
298 302
        LEMON_ASSERT(false, "PredMap is not initialized");
299 303
        return 0; // ignore warnings
300 304
      }
301 305
    };
302 306
    ///\brief \ref named-templ-param "Named parameter" for setting
303 307
    ///\c PredMap type.
304 308
    ///
305 309
    ///\ref named-templ-param "Named parameter" for setting
306 310
    ///\c PredMap type.
307
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
311
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
308 312
    template <class T>
309 313
    struct SetPredMap
310 314
      : public Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > {
311 315
      typedef Dijkstra< Digraph, LengthMap, SetPredMapTraits<T> > Create;
312 316
    };
313 317

	
314 318
    template <class T>
315 319
    struct SetDistMapTraits : public Traits {
316 320
      typedef T DistMap;
317 321
      static DistMap *createDistMap(const Digraph &)
318 322
      {
319 323
        LEMON_ASSERT(false, "DistMap is not initialized");
320 324
        return 0; // ignore warnings
321 325
      }
322 326
    };
323 327
    ///\brief \ref named-templ-param "Named parameter" for setting
324 328
    ///\c DistMap type.
325 329
    ///
326 330
    ///\ref named-templ-param "Named parameter" for setting
327 331
    ///\c DistMap type.
328
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
332
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
329 333
    template <class T>
330 334
    struct SetDistMap
331 335
      : public Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > {
332 336
      typedef Dijkstra< Digraph, LengthMap, SetDistMapTraits<T> > Create;
333 337
    };
334 338

	
335 339
    template <class T>
336 340
    struct SetProcessedMapTraits : public Traits {
337 341
      typedef T ProcessedMap;
338 342
      static ProcessedMap *createProcessedMap(const Digraph &)
339 343
      {
340 344
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
341 345
        return 0; // ignore warnings
342 346
      }
343 347
    };
344 348
    ///\brief \ref named-templ-param "Named parameter" for setting
345 349
    ///\c ProcessedMap type.
346 350
    ///
347 351
    ///\ref named-templ-param "Named parameter" for setting
348 352
    ///\c ProcessedMap type.
349
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
353
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
350 354
    template <class T>
351 355
    struct SetProcessedMap
352 356
      : public Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > {
353 357
      typedef Dijkstra< Digraph, LengthMap, SetProcessedMapTraits<T> > Create;
354 358
    };
355 359

	
356 360
    struct SetStandardProcessedMapTraits : public Traits {
357 361
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
358 362
      static ProcessedMap *createProcessedMap(const Digraph &g)
359 363
      {
360 364
        return new ProcessedMap(g);
361 365
      }
362 366
    };
363 367
    ///\brief \ref named-templ-param "Named parameter" for setting
364 368
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
365 369
    ///
366 370
    ///\ref named-templ-param "Named parameter" for setting
367 371
    ///\c ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
368 372
    ///If you don't set it explicitly, it will be automatically allocated.
369 373
    struct SetStandardProcessedMap
370 374
      : public Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits > {
371 375
      typedef Dijkstra< Digraph, LengthMap, SetStandardProcessedMapTraits >
372 376
      Create;
373 377
    };
374 378

	
375 379
    template <class H, class CR>
376 380
    struct SetHeapTraits : public Traits {
377 381
      typedef CR HeapCrossRef;
378 382
      typedef H Heap;
379 383
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
380 384
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
381 385
        return 0; // ignore warnings
382 386
      }
383 387
      static Heap *createHeap(HeapCrossRef &)
384 388
      {
385 389
        LEMON_ASSERT(false, "Heap is not initialized");
386 390
        return 0; // ignore warnings
387 391
      }
388 392
    };
389 393
    ///\brief \ref named-templ-param "Named parameter" for setting
390 394
    ///heap and cross reference types
391 395
    ///
392 396
    ///\ref named-templ-param "Named parameter" for setting heap and cross
393 397
    ///reference types. If this named parameter is used, then external
394 398
    ///heap and cross reference objects must be passed to the algorithm
395 399
    ///using the \ref heap() function before calling \ref run(Node) "run()"
396 400
    ///or \ref init().
397 401
    ///\sa SetStandardHeap
398 402
    template <class H, class CR = typename Digraph::template NodeMap<int> >
399 403
    struct SetHeap
400 404
      : public Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > {
401 405
      typedef Dijkstra< Digraph, LengthMap, SetHeapTraits<H, CR> > Create;
402 406
    };
403 407

	
404 408
    template <class H, class CR>
405 409
    struct SetStandardHeapTraits : public Traits {
406 410
      typedef CR HeapCrossRef;
407 411
      typedef H Heap;
408 412
      static HeapCrossRef *createHeapCrossRef(const Digraph &G) {
409 413
        return new HeapCrossRef(G);
410 414
      }
411 415
      static Heap *createHeap(HeapCrossRef &R)
412 416
      {
413 417
        return new Heap(R);
414 418
      }
415 419
    };
416 420
    ///\brief \ref named-templ-param "Named parameter" for setting
417 421
    ///heap and cross reference types with automatic allocation
418 422
    ///
419 423
    ///\ref named-templ-param "Named parameter" for setting heap and cross
420 424
    ///reference types with automatic allocation.
421 425
    ///They should have standard constructor interfaces to be able to
422 426
    ///automatically created by the algorithm (i.e. the digraph should be
423 427
    ///passed to the constructor of the cross reference and the cross
424 428
    ///reference should be passed to the constructor of the heap).
425 429
    ///However external heap and cross reference objects could also be
426 430
    ///passed to the algorithm using the \ref heap() function before
427 431
    ///calling \ref run(Node) "run()" or \ref init().
428 432
    ///\sa SetHeap
429 433
    template <class H, class CR = typename Digraph::template NodeMap<int> >
430 434
    struct SetStandardHeap
431 435
      : public Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> > {
432 436
      typedef Dijkstra< Digraph, LengthMap, SetStandardHeapTraits<H, CR> >
433 437
      Create;
434 438
    };
435 439

	
436 440
    template <class T>
437 441
    struct SetOperationTraitsTraits : public Traits {
438 442
      typedef T OperationTraits;
439 443
    };
440 444

	
441 445
    /// \brief \ref named-templ-param "Named parameter" for setting
442 446
    ///\c OperationTraits type
443 447
    ///
444 448
    ///\ref named-templ-param "Named parameter" for setting
445 449
    ///\c OperationTraits type.
450
    /// For more information see \ref DijkstraDefaultOperationTraits.
446 451
    template <class T>
447 452
    struct SetOperationTraits
448 453
      : public Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> > {
449 454
      typedef Dijkstra<Digraph, LengthMap, SetOperationTraitsTraits<T> >
450 455
      Create;
451 456
    };
452 457

	
453 458
    ///@}
454 459

	
455 460
  protected:
456 461

	
457 462
    Dijkstra() {}
458 463

	
459 464
  public:
460 465

	
461 466
    ///Constructor.
462 467

	
463 468
    ///Constructor.
464 469
    ///\param g The digraph the algorithm runs on.
465 470
    ///\param length The length map used by the algorithm.
466 471
    Dijkstra(const Digraph& g, const LengthMap& length) :
467 472
      G(&g), _length(&length),
468 473
      _pred(NULL), local_pred(false),
469 474
      _dist(NULL), local_dist(false),
470 475
      _processed(NULL), local_processed(false),
471 476
      _heap_cross_ref(NULL), local_heap_cross_ref(false),
472 477
      _heap(NULL), local_heap(false)
473 478
    { }
474 479

	
475 480
    ///Destructor.
476 481
    ~Dijkstra()
477 482
    {
478 483
      if(local_pred) delete _pred;
479 484
      if(local_dist) delete _dist;
480 485
      if(local_processed) delete _processed;
481 486
      if(local_heap_cross_ref) delete _heap_cross_ref;
482 487
      if(local_heap) delete _heap;
483 488
    }
484 489

	
485 490
    ///Sets the length map.
486 491

	
487 492
    ///Sets the length map.
488 493
    ///\return <tt> (*this) </tt>
489 494
    Dijkstra &lengthMap(const LengthMap &m)
490 495
    {
491 496
      _length = &m;
492 497
      return *this;
493 498
    }
... ...
@@ -756,534 +761,529 @@
756 761
    ///Runs the algorithm from the given source node.
757 762

	
758 763
    ///This method runs the %Dijkstra algorithm from node \c s
759 764
    ///in order to compute the shortest path to each node.
760 765
    ///
761 766
    ///The algorithm computes
762 767
    ///- the shortest path tree,
763 768
    ///- the distance of each node from the root.
764 769
    ///
765 770
    ///\note <tt>d.run(s)</tt> is just a shortcut of the following code.
766 771
    ///\code
767 772
    ///  d.init();
768 773
    ///  d.addSource(s);
769 774
    ///  d.start();
770 775
    ///\endcode
771 776
    void run(Node s) {
772 777
      init();
773 778
      addSource(s);
774 779
      start();
775 780
    }
776 781

	
777 782
    ///Finds the shortest path between \c s and \c t.
778 783

	
779 784
    ///This method runs the %Dijkstra algorithm from node \c s
780 785
    ///in order to compute the shortest path to node \c t
781 786
    ///(it stops searching when \c t is processed).
782 787
    ///
783 788
    ///\return \c true if \c t is reachable form \c s.
784 789
    ///
785 790
    ///\note Apart from the return value, <tt>d.run(s,t)</tt> is just a
786 791
    ///shortcut of the following code.
787 792
    ///\code
788 793
    ///  d.init();
789 794
    ///  d.addSource(s);
790 795
    ///  d.start(t);
791 796
    ///\endcode
792 797
    bool run(Node s,Node t) {
793 798
      init();
794 799
      addSource(s);
795 800
      start(t);
796 801
      return (*_heap_cross_ref)[t] == Heap::POST_HEAP;
797 802
    }
798 803

	
799 804
    ///@}
800 805

	
801 806
    ///\name Query Functions
802 807
    ///The results of the %Dijkstra algorithm can be obtained using these
803 808
    ///functions.\n
804
    ///Either \ref run(Node) "run()" or \ref start() should be called
809
    ///Either \ref run(Node) "run()" or \ref init() should be called
805 810
    ///before using them.
806 811

	
807 812
    ///@{
808 813

	
809
    ///The shortest path to a node.
814
    ///The shortest path to the given node.
810 815

	
811
    ///Returns the shortest path to a node.
816
    ///Returns the shortest path to the given node from the root(s).
812 817
    ///
813 818
    ///\warning \c t should be reached from the root(s).
814 819
    ///
815 820
    ///\pre Either \ref run(Node) "run()" or \ref init()
816 821
    ///must be called before using this function.
817 822
    Path path(Node t) const { return Path(*G, *_pred, t); }
818 823

	
819
    ///The distance of a node from the root(s).
824
    ///The distance of the given node from the root(s).
820 825

	
821
    ///Returns the distance of a node from the root(s).
826
    ///Returns the distance of the given node from the root(s).
822 827
    ///
823 828
    ///\warning If node \c v is not reached from the root(s), then
824 829
    ///the return value of this function is undefined.
825 830
    ///
826 831
    ///\pre Either \ref run(Node) "run()" or \ref init()
827 832
    ///must be called before using this function.
828 833
    Value dist(Node v) const { return (*_dist)[v]; }
829 834

	
830
    ///Returns the 'previous arc' of the shortest path tree for a node.
831

	
835
    ///\brief Returns the 'previous arc' of the shortest path tree for
836
    ///the given node.
837
    ///
832 838
    ///This function returns the 'previous arc' of the shortest path
833 839
    ///tree for the node \c v, i.e. it returns the last arc of a
834 840
    ///shortest path from a root to \c v. It is \c INVALID if \c v
835 841
    ///is not reached from the root(s) or if \c v is a root.
836 842
    ///
837 843
    ///The shortest path tree used here is equal to the shortest path
838
    ///tree used in \ref predNode().
844
    ///tree used in \ref predNode() and \ref predMap().
839 845
    ///
840 846
    ///\pre Either \ref run(Node) "run()" or \ref init()
841 847
    ///must be called before using this function.
842 848
    Arc predArc(Node v) const { return (*_pred)[v]; }
843 849

	
844
    ///Returns the 'previous node' of the shortest path tree for a node.
845

	
850
    ///\brief Returns the 'previous node' of the shortest path tree for
851
    ///the given node.
852
    ///
846 853
    ///This function returns the 'previous node' of the shortest path
847 854
    ///tree for the node \c v, i.e. it returns the last but one node
848
    ///from a shortest path from a root to \c v. It is \c INVALID
855
    ///of a shortest path from a root to \c v. It is \c INVALID
849 856
    ///if \c v is not reached from the root(s) or if \c v is a root.
850 857
    ///
851 858
    ///The shortest path tree used here is equal to the shortest path
852
    ///tree used in \ref predArc().
859
    ///tree used in \ref predArc() and \ref predMap().
853 860
    ///
854 861
    ///\pre Either \ref run(Node) "run()" or \ref init()
855 862
    ///must be called before using this function.
856 863
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
857 864
                                  G->source((*_pred)[v]); }
858 865

	
859 866
    ///\brief Returns a const reference to the node map that stores the
860 867
    ///distances of the nodes.
861 868
    ///
862 869
    ///Returns a const reference to the node map that stores the distances
863 870
    ///of the nodes calculated by the algorithm.
864 871
    ///
865 872
    ///\pre Either \ref run(Node) "run()" or \ref init()
866 873
    ///must be called before using this function.
867 874
    const DistMap &distMap() const { return *_dist;}
868 875

	
869 876
    ///\brief Returns a const reference to the node map that stores the
870 877
    ///predecessor arcs.
871 878
    ///
872 879
    ///Returns a const reference to the node map that stores the predecessor
873
    ///arcs, which form the shortest path tree.
880
    ///arcs, which form the shortest path tree (forest).
874 881
    ///
875 882
    ///\pre Either \ref run(Node) "run()" or \ref init()
876 883
    ///must be called before using this function.
877 884
    const PredMap &predMap() const { return *_pred;}
878 885

	
879
    ///Checks if a node is reached from the root(s).
886
    ///Checks if the given node is reached from the root(s).
880 887

	
881 888
    ///Returns \c true if \c v is reached from the root(s).
882 889
    ///
883 890
    ///\pre Either \ref run(Node) "run()" or \ref init()
884 891
    ///must be called before using this function.
885 892
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
886 893
                                        Heap::PRE_HEAP; }
887 894

	
888 895
    ///Checks if a node is processed.
889 896

	
890 897
    ///Returns \c true if \c v is processed, i.e. the shortest
891 898
    ///path to \c v has already found.
892 899
    ///
893 900
    ///\pre Either \ref run(Node) "run()" or \ref init()
894 901
    ///must be called before using this function.
895 902
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
896 903
                                          Heap::POST_HEAP; }
897 904

	
898
    ///The current distance of a node from the root(s).
905
    ///The current distance of the given node from the root(s).
899 906

	
900
    ///Returns the current distance of a node from the root(s).
907
    ///Returns the current distance of the given node from the root(s).
901 908
    ///It may be decreased in the following processes.
902 909
    ///
903 910
    ///\pre Either \ref run(Node) "run()" or \ref init()
904 911
    ///must be called before using this function and
905 912
    ///node \c v must be reached but not necessarily processed.
906 913
    Value currentDist(Node v) const {
907 914
      return processed(v) ? (*_dist)[v] : (*_heap)[v];
908 915
    }
909 916

	
910 917
    ///@}
911 918
  };
912 919

	
913 920

	
914 921
  ///Default traits class of dijkstra() function.
915 922

	
916 923
  ///Default traits class of dijkstra() function.
917 924
  ///\tparam GR The type of the digraph.
918 925
  ///\tparam LEN The type of the length map.
919 926
  template<class GR, class LEN>
920 927
  struct DijkstraWizardDefaultTraits
921 928
  {
922 929
    ///The type of the digraph the algorithm runs on.
923 930
    typedef GR Digraph;
924 931
    ///The type of the map that stores the arc lengths.
925 932

	
926 933
    ///The type of the map that stores the arc lengths.
927
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
934
    ///It must conform to the \ref concepts::ReadMap "ReadMap" concept.
928 935
    typedef LEN LengthMap;
929
    ///The type of the length of the arcs.
936
    ///The type of the arc lengths.
930 937
    typedef typename LEN::Value Value;
931 938

	
932 939
    /// Operation traits for Dijkstra algorithm.
933 940

	
934 941
    /// This class defines the operations that are used in the algorithm.
935 942
    /// \see DijkstraDefaultOperationTraits
936 943
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
937 944

	
938 945
    /// The cross reference type used by the heap.
939 946

	
940 947
    /// The cross reference type used by the heap.
941 948
    /// Usually it is \c Digraph::NodeMap<int>.
942 949
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
943 950
    ///Instantiates a \ref HeapCrossRef.
944 951

	
945 952
    ///This function instantiates a \ref HeapCrossRef.
946 953
    /// \param g is the digraph, to which we would like to define the
947 954
    /// HeapCrossRef.
948 955
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
949 956
    {
950 957
      return new HeapCrossRef(g);
951 958
    }
952 959

	
953 960
    ///The heap type used by the Dijkstra algorithm.
954 961

	
955 962
    ///The heap type used by the Dijkstra algorithm.
956 963
    ///
957 964
    ///\sa BinHeap
958 965
    ///\sa Dijkstra
959 966
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
960 967
                    std::less<Value> > Heap;
961 968

	
962 969
    ///Instantiates a \ref Heap.
963 970

	
964 971
    ///This function instantiates a \ref Heap.
965 972
    /// \param r is the HeapCrossRef which is used.
966 973
    static Heap *createHeap(HeapCrossRef& r)
967 974
    {
968 975
      return new Heap(r);
969 976
    }
970 977

	
971 978
    ///\brief The type of the map that stores the predecessor
972 979
    ///arcs of the shortest paths.
973 980
    ///
974 981
    ///The type of the map that stores the predecessor
975 982
    ///arcs of the shortest paths.
976
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
983
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
977 984
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
978 985
    ///Instantiates a PredMap.
979 986

	
980 987
    ///This function instantiates a PredMap.
981 988
    ///\param g is the digraph, to which we would like to define the
982 989
    ///PredMap.
983 990
    static PredMap *createPredMap(const Digraph &g)
984 991
    {
985 992
      return new PredMap(g);
986 993
    }
987 994

	
988 995
    ///The type of the map that indicates which nodes are processed.
989 996

	
990 997
    ///The type of the map that indicates which nodes are processed.
991
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
998
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
992 999
    ///By default it is a NullMap.
993 1000
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
994 1001
    ///Instantiates a ProcessedMap.
995 1002

	
996 1003
    ///This function instantiates a ProcessedMap.
997 1004
    ///\param g is the digraph, to which
998 1005
    ///we would like to define the ProcessedMap.
999 1006
#ifdef DOXYGEN
1000 1007
    static ProcessedMap *createProcessedMap(const Digraph &g)
1001 1008
#else
1002 1009
    static ProcessedMap *createProcessedMap(const Digraph &)
1003 1010
#endif
1004 1011
    {
1005 1012
      return new ProcessedMap();
1006 1013
    }
1007 1014

	
1008 1015
    ///The type of the map that stores the distances of the nodes.
1009 1016

	
1010 1017
    ///The type of the map that stores the distances of the nodes.
1011
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1018
    ///It must conform to the \ref concepts::WriteMap "WriteMap" concept.
1012 1019
    typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap;
1013 1020
    ///Instantiates a DistMap.
1014 1021

	
1015 1022
    ///This function instantiates a DistMap.
1016 1023
    ///\param g is the digraph, to which we would like to define
1017 1024
    ///the DistMap
1018 1025
    static DistMap *createDistMap(const Digraph &g)
1019 1026
    {
1020 1027
      return new DistMap(g);
1021 1028
    }
1022 1029

	
1023 1030
    ///The type of the shortest paths.
1024 1031

	
1025 1032
    ///The type of the shortest paths.
1026
    ///It must meet the \ref concepts::Path "Path" concept.
1033
    ///It must conform to the \ref concepts::Path "Path" concept.
1027 1034
    typedef lemon::Path<Digraph> Path;
1028 1035
  };
1029 1036

	
1030 1037
  /// Default traits class used by DijkstraWizard
1031 1038

	
1032
  /// To make it easier to use Dijkstra algorithm
1033
  /// we have created a wizard class.
1034
  /// This \ref DijkstraWizard class needs default traits,
1035
  /// as well as the \ref Dijkstra class.
1036
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1037
  /// \ref DijkstraWizard class.
1039
  /// Default traits class used by DijkstraWizard.
1040
  /// \tparam GR The type of the digraph.
1041
  /// \tparam LEN The type of the length map.
1038 1042
  template<typename GR, typename LEN>
1039 1043
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN>
1040 1044
  {
1041 1045
    typedef DijkstraWizardDefaultTraits<GR,LEN> Base;
1042 1046
  protected:
1043 1047
    //The type of the nodes in the digraph.
1044 1048
    typedef typename Base::Digraph::Node Node;
1045 1049

	
1046 1050
    //Pointer to the digraph the algorithm runs on.
1047 1051
    void *_g;
1048 1052
    //Pointer to the length map.
1049 1053
    void *_length;
1050 1054
    //Pointer to the map of processed nodes.
1051 1055
    void *_processed;
1052 1056
    //Pointer to the map of predecessors arcs.
1053 1057
    void *_pred;
1054 1058
    //Pointer to the map of distances.
1055 1059
    void *_dist;
1056 1060
    //Pointer to the shortest path to the target node.
1057 1061
    void *_path;
1058 1062
    //Pointer to the distance of the target node.
1059 1063
    void *_di;
1060 1064

	
1061 1065
  public:
1062 1066
    /// Constructor.
1063 1067

	
1064 1068
    /// This constructor does not require parameters, therefore it initiates
1065 1069
    /// all of the attributes to \c 0.
1066 1070
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1067 1071
                           _dist(0), _path(0), _di(0) {}
1068 1072

	
1069 1073
    /// Constructor.
1070 1074

	
1071 1075
    /// This constructor requires two parameters,
1072 1076
    /// others are initiated to \c 0.
1073 1077
    /// \param g The digraph the algorithm runs on.
1074 1078
    /// \param l The length map.
1075 1079
    DijkstraWizardBase(const GR &g,const LEN &l) :
1076 1080
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1077 1081
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&l))),
1078 1082
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1079 1083

	
1080 1084
  };
1081 1085

	
1082 1086
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1083 1087

	
1084 1088
  /// This auxiliary class is created to implement the
1085 1089
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1086 1090
  /// It does not have own \ref run(Node) "run()" method, it uses the
1087 1091
  /// functions and features of the plain \ref Dijkstra.
1088 1092
  ///
1089 1093
  /// This class should only be used through the \ref dijkstra() function,
1090 1094
  /// which makes it easier to use the algorithm.
1091 1095
  template<class TR>
1092 1096
  class DijkstraWizard : public TR
1093 1097
  {
1094 1098
    typedef TR Base;
1095 1099

	
1096
    ///The type of the digraph the algorithm runs on.
1097 1100
    typedef typename TR::Digraph Digraph;
1098 1101

	
1099 1102
    typedef typename Digraph::Node Node;
1100 1103
    typedef typename Digraph::NodeIt NodeIt;
1101 1104
    typedef typename Digraph::Arc Arc;
1102 1105
    typedef typename Digraph::OutArcIt OutArcIt;
1103 1106

	
1104
    ///The type of the map that stores the arc lengths.
1105 1107
    typedef typename TR::LengthMap LengthMap;
1106
    ///The type of the length of the arcs.
1107 1108
    typedef typename LengthMap::Value Value;
1108
    ///\brief The type of the map that stores the predecessor
1109
    ///arcs of the shortest paths.
1110 1109
    typedef typename TR::PredMap PredMap;
1111
    ///The type of the map that stores the distances of the nodes.
1112 1110
    typedef typename TR::DistMap DistMap;
1113
    ///The type of the map that indicates which nodes are processed.
1114 1111
    typedef typename TR::ProcessedMap ProcessedMap;
1115
    ///The type of the shortest paths
1116 1112
    typedef typename TR::Path Path;
1117
    ///The heap type used by the dijkstra algorithm.
1118 1113
    typedef typename TR::Heap Heap;
1119 1114

	
1120 1115
  public:
1121 1116

	
1122 1117
    /// Constructor.
1123 1118
    DijkstraWizard() : TR() {}
1124 1119

	
1125 1120
    /// Constructor that requires parameters.
1126 1121

	
1127 1122
    /// Constructor that requires parameters.
1128 1123
    /// These parameters will be the default values for the traits class.
1129 1124
    /// \param g The digraph the algorithm runs on.
1130 1125
    /// \param l The length map.
1131 1126
    DijkstraWizard(const Digraph &g, const LengthMap &l) :
1132 1127
      TR(g,l) {}
1133 1128

	
1134 1129
    ///Copy constructor
1135 1130
    DijkstraWizard(const TR &b) : TR(b) {}
1136 1131

	
1137 1132
    ~DijkstraWizard() {}
1138 1133

	
1139 1134
    ///Runs Dijkstra algorithm from the given source node.
1140 1135

	
1141 1136
    ///This method runs %Dijkstra algorithm from the given source node
1142 1137
    ///in order to compute the shortest path to each node.
1143 1138
    void run(Node s)
1144 1139
    {
1145 1140
      Dijkstra<Digraph,LengthMap,TR>
1146 1141
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1147 1142
             *reinterpret_cast<const LengthMap*>(Base::_length));
1148 1143
      if (Base::_pred)
1149 1144
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1150 1145
      if (Base::_dist)
1151 1146
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1152 1147
      if (Base::_processed)
1153 1148
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1154 1149
      dijk.run(s);
1155 1150
    }
1156 1151

	
1157 1152
    ///Finds the shortest path between \c s and \c t.
1158 1153

	
1159 1154
    ///This method runs the %Dijkstra algorithm from node \c s
1160 1155
    ///in order to compute the shortest path to node \c t
1161 1156
    ///(it stops searching when \c t is processed).
1162 1157
    ///
1163 1158
    ///\return \c true if \c t is reachable form \c s.
1164 1159
    bool run(Node s, Node t)
1165 1160
    {
1166 1161
      Dijkstra<Digraph,LengthMap,TR>
1167 1162
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1168 1163
             *reinterpret_cast<const LengthMap*>(Base::_length));
1169 1164
      if (Base::_pred)
1170 1165
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1171 1166
      if (Base::_dist)
1172 1167
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1173 1168
      if (Base::_processed)
1174 1169
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1175 1170
      dijk.run(s,t);
1176 1171
      if (Base::_path)
1177 1172
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1178 1173
      if (Base::_di)
1179 1174
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1180 1175
      return dijk.reached(t);
1181 1176
    }
1182 1177

	
1183 1178
    template<class T>
1184 1179
    struct SetPredMapBase : public Base {
1185 1180
      typedef T PredMap;
1186 1181
      static PredMap *createPredMap(const Digraph &) { return 0; };
1187 1182
      SetPredMapBase(const TR &b) : TR(b) {}
1188 1183
    };
1189
    ///\brief \ref named-func-param "Named parameter"
1190
    ///for setting PredMap object.
1184

	
1185
    ///\brief \ref named-templ-param "Named parameter" for setting
1186
    ///the predecessor map.
1191 1187
    ///
1192
    ///\ref named-func-param "Named parameter"
1193
    ///for setting PredMap object.
1188
    ///\ref named-templ-param "Named parameter" function for setting
1189
    ///the map that stores the predecessor arcs of the nodes.
1194 1190
    template<class T>
1195 1191
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1196 1192
    {
1197 1193
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1198 1194
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1199 1195
    }
1200 1196

	
1201 1197
    template<class T>
1202 1198
    struct SetDistMapBase : public Base {
1203 1199
      typedef T DistMap;
1204 1200
      static DistMap *createDistMap(const Digraph &) { return 0; };
1205 1201
      SetDistMapBase(const TR &b) : TR(b) {}
1206 1202
    };
1207
    ///\brief \ref named-func-param "Named parameter"
1208
    ///for setting DistMap object.
1203

	
1204
    ///\brief \ref named-templ-param "Named parameter" for setting
1205
    ///the distance map.
1209 1206
    ///
1210
    ///\ref named-func-param "Named parameter"
1211
    ///for setting DistMap object.
1207
    ///\ref named-templ-param "Named parameter" function for setting
1208
    ///the map that stores the distances of the nodes calculated
1209
    ///by the algorithm.
1212 1210
    template<class T>
1213 1211
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1214 1212
    {
1215 1213
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1216 1214
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1217 1215
    }
1218 1216

	
1219 1217
    template<class T>
1220 1218
    struct SetProcessedMapBase : public Base {
1221 1219
      typedef T ProcessedMap;
1222 1220
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1223 1221
      SetProcessedMapBase(const TR &b) : TR(b) {}
1224 1222
    };
1225
    ///\brief \ref named-func-param "Named parameter"
1226
    ///for setting ProcessedMap object.
1223

	
1224
    ///\brief \ref named-func-param "Named parameter" for setting
1225
    ///the processed map.
1227 1226
    ///
1228
    /// \ref named-func-param "Named parameter"
1229
    ///for setting ProcessedMap object.
1227
    ///\ref named-templ-param "Named parameter" function for setting
1228
    ///the map that indicates which nodes are processed.
1230 1229
    template<class T>
1231 1230
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1232 1231
    {
1233 1232
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1234 1233
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1235 1234
    }
1236 1235

	
1237 1236
    template<class T>
1238 1237
    struct SetPathBase : public Base {
1239 1238
      typedef T Path;
1240 1239
      SetPathBase(const TR &b) : TR(b) {}
1241 1240
    };
1241

	
1242 1242
    ///\brief \ref named-func-param "Named parameter"
1243 1243
    ///for getting the shortest path to the target node.
1244 1244
    ///
1245 1245
    ///\ref named-func-param "Named parameter"
1246 1246
    ///for getting the shortest path to the target node.
1247 1247
    template<class T>
1248 1248
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1249 1249
    {
1250 1250
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1251 1251
      return DijkstraWizard<SetPathBase<T> >(*this);
1252 1252
    }
1253 1253

	
1254 1254
    ///\brief \ref named-func-param "Named parameter"
1255 1255
    ///for getting the distance of the target node.
1256 1256
    ///
1257 1257
    ///\ref named-func-param "Named parameter"
1258 1258
    ///for getting the distance of the target node.
1259 1259
    DijkstraWizard dist(const Value &d)
1260 1260
    {
1261 1261
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1262 1262
      return *this;
1263 1263
    }
1264 1264

	
1265 1265
  };
1266 1266

	
1267 1267
  ///Function-type interface for Dijkstra algorithm.
1268 1268

	
1269 1269
  /// \ingroup shortest_path
1270 1270
  ///Function-type interface for Dijkstra algorithm.
1271 1271
  ///
1272 1272
  ///This function also has several \ref named-func-param "named parameters",
1273 1273
  ///they are declared as the members of class \ref DijkstraWizard.
1274 1274
  ///The following examples show how to use these parameters.
1275 1275
  ///\code
1276 1276
  ///  // Compute shortest path from node s to each node
1277 1277
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1278 1278
  ///
1279 1279
  ///  // Compute shortest path from s to t
1280 1280
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1281 1281
  ///\endcode
1282 1282
  ///\warning Don't forget to put the \ref DijkstraWizard::run(Node) "run()"
1283 1283
  ///to the end of the parameter list.
1284 1284
  ///\sa DijkstraWizard
1285 1285
  ///\sa Dijkstra
1286 1286
  template<typename GR, typename LEN>
1287 1287
  DijkstraWizard<DijkstraWizardBase<GR,LEN> >
1288 1288
  dijkstra(const GR &digraph, const LEN &length)
1289 1289
  {
Show white space 96 line context
... ...
@@ -1745,101 +1745,101 @@
1745 1745
            typename KEY = typename _maps_bits::IteratorTraits<IT>::Value>
1746 1746
#endif
1747 1747
  class LoggerBoolMap : public MapBase<KEY, bool> {
1748 1748
  public:
1749 1749

	
1750 1750
    ///\e
1751 1751
    typedef KEY Key;
1752 1752
    ///\e
1753 1753
    typedef bool Value;
1754 1754
    ///\e
1755 1755
    typedef IT Iterator;
1756 1756

	
1757 1757
    /// Constructor
1758 1758
    LoggerBoolMap(Iterator it)
1759 1759
      : _begin(it), _end(it) {}
1760 1760

	
1761 1761
    /// Gives back the given iterator set for the first key
1762 1762
    Iterator begin() const {
1763 1763
      return _begin;
1764 1764
    }
1765 1765

	
1766 1766
    /// Gives back the the 'after the last' iterator
1767 1767
    Iterator end() const {
1768 1768
      return _end;
1769 1769
    }
1770 1770

	
1771 1771
    /// The set function of the map
1772 1772
    void set(const Key& key, Value value) {
1773 1773
      if (value) {
1774 1774
        *_end++ = key;
1775 1775
      }
1776 1776
    }
1777 1777

	
1778 1778
  private:
1779 1779
    Iterator _begin;
1780 1780
    Iterator _end;
1781 1781
  };
1782 1782

	
1783 1783
  /// Returns a \c LoggerBoolMap class
1784 1784

	
1785 1785
  /// This function just returns a \c LoggerBoolMap class.
1786 1786
  ///
1787 1787
  /// The most important usage of it is storing certain nodes or arcs
1788 1788
  /// that were marked \c true by an algorithm.
1789 1789
  /// For example it makes easier to store the nodes in the processing
1790 1790
  /// order of Dfs algorithm, as the following examples show.
1791 1791
  /// \code
1792 1792
  ///   std::vector<Node> v;
1793
  ///   dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();
1793
  ///   dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s);
1794 1794
  /// \endcode
1795 1795
  /// \code
1796 1796
  ///   std::vector<Node> v(countNodes(g));
1797
  ///   dfs(g,s).processedMap(loggerBoolMap(v.begin())).run();
1797
  ///   dfs(g).processedMap(loggerBoolMap(v.begin())).run(s);
1798 1798
  /// \endcode
1799 1799
  ///
1800 1800
  /// \note The container of the iterator must contain enough space
1801 1801
  /// for the elements or the iterator should be an inserter iterator.
1802 1802
  ///
1803 1803
  /// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so
1804 1804
  /// it cannot be used when a readable map is needed, for example as
1805 1805
  /// \c ReachedMap for \c Bfs, \c Dfs and \c Dijkstra algorithms.
1806 1806
  ///
1807 1807
  /// \relates LoggerBoolMap
1808 1808
  template<typename Iterator>
1809 1809
  inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
1810 1810
    return LoggerBoolMap<Iterator>(it);
1811 1811
  }
1812 1812

	
1813 1813
  /// @}
1814 1814

	
1815 1815
  /// \addtogroup graph_maps
1816 1816
  /// @{
1817 1817

	
1818 1818
  /// \brief Provides an immutable and unique id for each item in a graph.
1819 1819
  ///
1820 1820
  /// IdMap provides a unique and immutable id for each item of the
1821 1821
  /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 
1822 1822
  ///  - \b unique: different items get different ids,
1823 1823
  ///  - \b immutable: the id of an item does not change (even if you
1824 1824
  ///    delete other nodes).
1825 1825
  ///
1826 1826
  /// Using this map you get access (i.e. can read) the inner id values of
1827 1827
  /// the items stored in the graph, which is returned by the \c id()
1828 1828
  /// function of the graph. This map can be inverted with its member
1829 1829
  /// class \c InverseMap or with the \c operator() member.
1830 1830
  ///
1831 1831
  /// \tparam GR The graph type.
1832 1832
  /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or
1833 1833
  /// \c GR::Edge).
1834 1834
  ///
1835 1835
  /// \see RangeIdMap
1836 1836
  template <typename GR, typename K>
1837 1837
  class IdMap : public MapBase<K, int> {
1838 1838
  public:
1839 1839
    /// The graph type of IdMap.
1840 1840
    typedef GR Graph;
1841 1841
    typedef GR Digraph;
1842 1842
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1843 1843
    typedef K Item;
1844 1844
    /// The key type of IdMap (\c Node, \c Arc or \c Edge).
1845 1845
    typedef K Key;
0 comments (0 inline)