gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Improve the function-type interface of bfs, dfs, and dijkstra (ticket #96) - BfsWizard and DfsWizard have run(s), run(s,t), and run() functions, DijkstraWizard has run(s) and run(s,t) functions. - Set NodeMap<T> instead of NullMap as PredMap and DistMap in the default traits classes for the function-type interface. - Modify the related test files. - Doc improvements. - Bug fix in concepts/path.h.
0 7 0
default
7 files changed with 488 insertions and 338 deletions:
↑ Collapse diff ↑
Ignore white space 192 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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
#include <lemon/path.h>
31 32

	
32 33
namespace lemon {
33 34

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	
115 116
  ///\ingroup search
116 117
  ///This class provides an efficient implementation of the %BFS algorithm.
117 118
  ///
118
  ///There is also a \ref bfs() "function type interface" for the BFS
119
  ///There is also a \ref bfs() "function-type interface" for the BFS
119 120
  ///algorithm, which is convenient in the simplier cases and it can be
120 121
  ///used easier.
121 122
  ///
122 123
  ///\tparam GR The type of the digraph the algorithm runs on.
123 124
  ///The default value is \ref ListDigraph. The value of GR is not used
124 125
  ///directly by \ref Bfs, it is only passed to \ref BfsDefaultTraits.
125 126
  ///\tparam TR Traits class to set various data types used by the algorithm.
126 127
  ///The default traits class is
127 128
  ///\ref BfsDefaultTraits "BfsDefaultTraits<GR>".
128 129
  ///See \ref BfsDefaultTraits for the documentation of
129 130
  ///a Bfs traits class.
130 131
#ifdef DOXYGEN
131 132
  template <typename GR,
132 133
            typename TR>
133 134
#else
134 135
  template <typename GR=ListDigraph,
135 136
            typename TR=BfsDefaultTraits<GR> >
136 137
#endif
137 138
  class Bfs {
138 139
  public:
139 140
    ///\ref Exception for uninitialized parameters.
140 141

	
141 142
    ///This error represents problems in the initialization of the
142 143
    ///parameters of the algorithm.
143 144
    class UninitializedParameter : public lemon::UninitializedParameter {
144 145
    public:
145 146
      virtual const char* what() const throw() {
146 147
        return "lemon::Bfs::UninitializedParameter";
147 148
      }
148 149
    };
149 150

	
150 151
    ///The type of the digraph the algorithm runs on.
151 152
    typedef typename TR::Digraph Digraph;
152 153

	
153 154
    ///\brief The type of the map that stores the predecessor arcs of the
154 155
    ///shortest paths.
155 156
    typedef typename TR::PredMap PredMap;
156 157
    ///The type of the map that stores the distances of the nodes.
157 158
    typedef typename TR::DistMap DistMap;
158 159
    ///The type of the map that indicates which nodes are reached.
159 160
    typedef typename TR::ReachedMap ReachedMap;
160 161
    ///The type of the map that indicates which nodes are processed.
161 162
    typedef typename TR::ProcessedMap ProcessedMap;
162 163
    ///The type of the paths.
163 164
    typedef PredMapPath<Digraph, PredMap> Path;
164 165

	
165 166
    ///The traits class.
166 167
    typedef TR Traits;
167 168

	
168 169
  private:
169 170

	
170 171
    typedef typename Digraph::Node Node;
171 172
    typedef typename Digraph::NodeIt NodeIt;
172 173
    typedef typename Digraph::Arc Arc;
173 174
    typedef typename Digraph::OutArcIt OutArcIt;
174 175

	
175 176
    //Pointer to the underlying digraph.
176 177
    const Digraph *G;
177 178
    //Pointer to the map of predecessor arcs.
178 179
    PredMap *_pred;
179 180
    //Indicates if _pred is locally allocated (true) or not.
180 181
    bool local_pred;
181 182
    //Pointer to the map of distances.
182 183
    DistMap *_dist;
183 184
    //Indicates if _dist is locally allocated (true) or not.
184 185
    bool local_dist;
185 186
    //Pointer to the map of reached status of the nodes.
186 187
    ReachedMap *_reached;
187 188
    //Indicates if _reached is locally allocated (true) or not.
188 189
    bool local_reached;
189 190
    //Pointer to the map of processed status of the nodes.
190 191
    ProcessedMap *_processed;
191 192
    //Indicates if _processed is locally allocated (true) or not.
192 193
    bool local_processed;
193 194

	
194 195
    std::vector<typename Digraph::Node> _queue;
195 196
    int _queue_head,_queue_tail,_queue_next_dist;
196 197
    int _curr_dist;
197 198

	
198 199
    ///Creates the maps if necessary.
199 200
    ///\todo Better memory allocation (instead of new).
200 201
    void create_maps()
201 202
    {
202 203
      if(!_pred) {
203 204
        local_pred = true;
204 205
        _pred = Traits::createPredMap(*G);
205 206
      }
206 207
      if(!_dist) {
207 208
        local_dist = true;
208 209
        _dist = Traits::createDistMap(*G);
209 210
      }
210 211
      if(!_reached) {
211 212
        local_reached = true;
212 213
        _reached = Traits::createReachedMap(*G);
213 214
      }
214 215
      if(!_processed) {
... ...
@@ -748,510 +749,547 @@
748 749
    ///The shortest path to a node.
749 750

	
750 751
    ///Returns the shortest path to a node.
751 752
    ///
752 753
    ///\warning \c t should be reachable from the root(s).
753 754
    ///
754 755
    ///\pre Either \ref run() or \ref start() must be called before
755 756
    ///using this function.
756 757
    Path path(Node t) const { return Path(*G, *_pred, t); }
757 758

	
758 759
    ///The distance of a node from the root(s).
759 760

	
760 761
    ///Returns the distance of a node from the root(s).
761 762
    ///
762 763
    ///\warning If node \c v is not reachable from the root(s), then
763 764
    ///the return value of this function is undefined.
764 765
    ///
765 766
    ///\pre Either \ref run() or \ref start() must be called before
766 767
    ///using this function.
767 768
    int dist(Node v) const { return (*_dist)[v]; }
768 769

	
769 770
    ///Returns the 'previous arc' of the shortest path tree for a node.
770 771

	
771 772
    ///This function returns the 'previous arc' of the shortest path
772 773
    ///tree for the node \c v, i.e. it returns the last arc of a
773 774
    ///shortest path from the root(s) to \c v. It is \c INVALID if \c v
774 775
    ///is not reachable from the root(s) or if \c v is a root.
775 776
    ///
776 777
    ///The shortest path tree used here is equal to the shortest path
777 778
    ///tree used in \ref predNode().
778 779
    ///
779 780
    ///\pre Either \ref run() or \ref start() must be called before
780 781
    ///using this function.
781 782
    Arc predArc(Node v) const { return (*_pred)[v];}
782 783

	
783 784
    ///Returns the 'previous node' of the shortest path tree for a node.
784 785

	
785 786
    ///This function returns the 'previous node' of the shortest path
786 787
    ///tree for the node \c v, i.e. it returns the last but one node
787 788
    ///from a shortest path from the root(s) to \c v. It is \c INVALID
788 789
    ///if \c v is not reachable from the root(s) or if \c v is a root.
789 790
    ///
790 791
    ///The shortest path tree used here is equal to the shortest path
791 792
    ///tree used in \ref predArc().
792 793
    ///
793 794
    ///\pre Either \ref run() or \ref start() must be called before
794 795
    ///using this function.
795 796
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
796 797
                                  G->source((*_pred)[v]); }
797 798

	
798 799
    ///\brief Returns a const reference to the node map that stores the
799 800
    /// distances of the nodes.
800 801
    ///
801 802
    ///Returns a const reference to the node map that stores the distances
802 803
    ///of the nodes calculated by the algorithm.
803 804
    ///
804 805
    ///\pre Either \ref run() or \ref init()
805 806
    ///must be called before using this function.
806 807
    const DistMap &distMap() const { return *_dist;}
807 808

	
808 809
    ///\brief Returns a const reference to the node map that stores the
809 810
    ///predecessor arcs.
810 811
    ///
811 812
    ///Returns a const reference to the node map that stores the predecessor
812 813
    ///arcs, which form the shortest path tree.
813 814
    ///
814 815
    ///\pre Either \ref run() or \ref init()
815 816
    ///must be called before using this function.
816 817
    const PredMap &predMap() const { return *_pred;}
817 818

	
818 819
    ///Checks if a node is reachable from the root(s).
819 820

	
820 821
    ///Returns \c true if \c v is reachable from the root(s).
821 822
    ///\pre Either \ref run() or \ref start()
822 823
    ///must be called before using this function.
823 824
    bool reached(Node v) const { return (*_reached)[v]; }
824 825

	
825 826
    ///@}
826 827
  };
827 828

	
828 829
  ///Default traits class of bfs() function.
829 830

	
830 831
  ///Default traits class of bfs() function.
831 832
  ///\tparam GR Digraph type.
832 833
  template<class GR>
833 834
  struct BfsWizardDefaultTraits
834 835
  {
835 836
    ///The type of the digraph the algorithm runs on.
836 837
    typedef GR Digraph;
837 838

	
838 839
    ///\brief The type of the map that stores the predecessor
839 840
    ///arcs of the shortest paths.
840 841
    ///
841 842
    ///The type of the map that stores the predecessor
842 843
    ///arcs of the shortest paths.
843 844
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
844
    typedef NullMap<typename Digraph::Node,typename Digraph::Arc> PredMap;
845
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
845 846
    ///Instantiates a \ref PredMap.
846 847

	
847 848
    ///This function instantiates a \ref PredMap.
848 849
    ///\param g is the digraph, to which we would like to define the
849 850
    ///\ref PredMap.
850 851
    ///\todo The digraph alone may be insufficient to initialize
851
#ifdef DOXYGEN
852 852
    static PredMap *createPredMap(const Digraph &g)
853
#else
854
    static PredMap *createPredMap(const Digraph &)
855
#endif
856 853
    {
857
      return new PredMap();
854
      return new PredMap(g);
858 855
    }
859 856

	
860 857
    ///The type of the map that indicates which nodes are processed.
861 858

	
862 859
    ///The type of the map that indicates which nodes are processed.
863 860
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
861
    ///By default it is a NullMap.
864 862
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
865 863
    ///Instantiates a \ref ProcessedMap.
866 864

	
867 865
    ///This function instantiates a \ref ProcessedMap.
868 866
    ///\param g is the digraph, to which
869 867
    ///we would like to define the \ref ProcessedMap.
870 868
#ifdef DOXYGEN
871 869
    static ProcessedMap *createProcessedMap(const Digraph &g)
872 870
#else
873 871
    static ProcessedMap *createProcessedMap(const Digraph &)
874 872
#endif
875 873
    {
876 874
      return new ProcessedMap();
877 875
    }
878 876

	
879 877
    ///The type of the map that indicates which nodes are reached.
880 878

	
881 879
    ///The type of the map that indicates which nodes are reached.
882 880
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
883 881
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
884 882
    ///Instantiates a \ref ReachedMap.
885 883

	
886 884
    ///This function instantiates a \ref ReachedMap.
887 885
    ///\param g is the digraph, to which
888 886
    ///we would like to define the \ref ReachedMap.
889 887
    static ReachedMap *createReachedMap(const Digraph &g)
890 888
    {
891 889
      return new ReachedMap(g);
892 890
    }
893 891

	
894 892
    ///The type of the map that stores the distances of the nodes.
895 893

	
896 894
    ///The type of the map that stores the distances of the nodes.
897 895
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
898
    ///
899
    typedef NullMap<typename Digraph::Node,int> DistMap;
896
    typedef typename Digraph::template NodeMap<int> DistMap;
900 897
    ///Instantiates a \ref DistMap.
901 898

	
902 899
    ///This function instantiates a \ref DistMap.
903 900
    ///\param g is the digraph, to which we would like to define
904 901
    ///the \ref DistMap
905
#ifdef DOXYGEN
906 902
    static DistMap *createDistMap(const Digraph &g)
907
#else
908
    static DistMap *createDistMap(const Digraph &)
909
#endif
910 903
    {
911
      return new DistMap();
904
      return new DistMap(g);
912 905
    }
906

	
907
    ///The type of the shortest paths.
908

	
909
    ///The type of the shortest paths.
910
    ///It must meet the \ref concepts::Path "Path" concept.
911
    typedef lemon::Path<Digraph> Path;
913 912
  };
914 913

	
915 914
  /// Default traits class used by \ref BfsWizard
916 915

	
917 916
  /// To make it easier to use Bfs algorithm
918 917
  /// we have created a wizard class.
919 918
  /// This \ref BfsWizard class needs default traits,
920 919
  /// as well as the \ref Bfs class.
921 920
  /// The \ref BfsWizardBase is a class to be the default traits of the
922 921
  /// \ref BfsWizard class.
923 922
  template<class GR>
924 923
  class BfsWizardBase : public BfsWizardDefaultTraits<GR>
925 924
  {
926 925

	
927 926
    typedef BfsWizardDefaultTraits<GR> Base;
928 927
  protected:
929 928
    //The type of the nodes in the digraph.
930 929
    typedef typename Base::Digraph::Node Node;
931 930

	
932 931
    //Pointer to the digraph the algorithm runs on.
933 932
    void *_g;
934 933
    //Pointer to the map of reached nodes.
935 934
    void *_reached;
936 935
    //Pointer to the map of processed nodes.
937 936
    void *_processed;
938 937
    //Pointer to the map of predecessors arcs.
939 938
    void *_pred;
940 939
    //Pointer to the map of distances.
941 940
    void *_dist;
942
    //Pointer to the source node.
943
    Node _source;
941
    //Pointer to the shortest path to the target node.
942
    void *_path;
943
    //Pointer to the distance of the target node.
944
    int *_di;
944 945

	
945 946
    public:
946 947
    /// Constructor.
947 948

	
948 949
    /// This constructor does not require parameters, therefore it initiates
949
    /// all of the attributes to default values (0, INVALID).
950
    /// all of the attributes to \c 0.
950 951
    BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
951
                      _dist(0), _source(INVALID) {}
952
                      _dist(0), _path(0), _di(0) {}
952 953

	
953 954
    /// Constructor.
954 955

	
955
    /// This constructor requires some parameters,
956
    /// listed in the parameters list.
957
    /// Others are initiated to 0.
956
    /// This constructor requires one parameter,
957
    /// others are initiated to \c 0.
958 958
    /// \param g The digraph the algorithm runs on.
959
    /// \param s The source node.
960
    BfsWizardBase(const GR &g, Node s=INVALID) :
959
    BfsWizardBase(const GR &g) :
961 960
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
962
      _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
961
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
963 962

	
964 963
  };
965 964

	
966
  /// Auxiliary class for the function type interface of BFS algorithm.
965
  /// Auxiliary class for the function-type interface of BFS algorithm.
967 966

	
968
  /// This auxiliary class is created to implement the function type
969
  /// interface of \ref Bfs algorithm. It uses the functions and features
970
  /// of the plain \ref Bfs, but it is much simpler to use it.
971
  /// It should only be used through the \ref bfs() function, which makes
972
  /// it easier to use the algorithm.
967
  /// This auxiliary class is created to implement the
968
  /// \ref bfs() "function-type interface" of \ref Bfs algorithm.
969
  /// It does not have own \ref run() method, it uses the functions
970
  /// and features of the plain \ref Bfs.
973 971
  ///
974
  /// Simplicity means that the way to change the types defined
975
  /// in the traits class is based on functions that returns the new class
976
  /// and not on templatable built-in classes.
977
  /// When using the plain \ref Bfs
978
  /// the new class with the modified type comes from
979
  /// the original class by using the ::
980
  /// operator. In the case of \ref BfsWizard only
981
  /// a function have to be called, and it will
982
  /// return the needed class.
983
  ///
984
  /// It does not have own \ref run() method. When its \ref run() method
985
  /// is called, it initiates a plain \ref Bfs object, and calls the
986
  /// \ref Bfs::run() method of it.
972
  /// This class should only be used through the \ref bfs() function,
973
  /// which makes it easier to use the algorithm.
987 974
  template<class TR>
988 975
  class BfsWizard : public TR
989 976
  {
990 977
    typedef TR Base;
991 978

	
992 979
    ///The type of the digraph the algorithm runs on.
993 980
    typedef typename TR::Digraph Digraph;
994 981

	
995 982
    typedef typename Digraph::Node Node;
996 983
    typedef typename Digraph::NodeIt NodeIt;
997 984
    typedef typename Digraph::Arc Arc;
998 985
    typedef typename Digraph::OutArcIt OutArcIt;
999 986

	
1000 987
    ///\brief The type of the map that stores the predecessor
1001 988
    ///arcs of the shortest paths.
1002 989
    typedef typename TR::PredMap PredMap;
1003 990
    ///\brief The type of the map that stores the distances of the nodes.
1004 991
    typedef typename TR::DistMap DistMap;
1005 992
    ///\brief The type of the map that indicates which nodes are reached.
1006 993
    typedef typename TR::ReachedMap ReachedMap;
1007 994
    ///\brief The type of the map that indicates which nodes are processed.
1008 995
    typedef typename TR::ProcessedMap ProcessedMap;
996
    ///The type of the shortest paths
997
    typedef typename TR::Path Path;
1009 998

	
1010 999
  public:
1011 1000

	
1012 1001
    /// Constructor.
1013 1002
    BfsWizard() : TR() {}
1014 1003

	
1015 1004
    /// Constructor that requires parameters.
1016 1005

	
1017 1006
    /// Constructor that requires parameters.
1018 1007
    /// These parameters will be the default values for the traits class.
1019
    BfsWizard(const Digraph &g, Node s=INVALID) :
1020
      TR(g,s) {}
1008
    /// \param g The digraph the algorithm runs on.
1009
    BfsWizard(const Digraph &g) :
1010
      TR(g) {}
1021 1011

	
1022 1012
    ///Copy constructor
1023 1013
    BfsWizard(const TR &b) : TR(b) {}
1024 1014

	
1025 1015
    ~BfsWizard() {}
1026 1016

	
1027
    ///Runs BFS algorithm from a source node.
1017
    ///Runs BFS algorithm from the given source node.
1028 1018

	
1029
    ///Runs BFS algorithm from a source node.
1030
    ///The node can be given with the \ref source() function.
1019
    ///This method runs BFS algorithm from node \c s
1020
    ///in order to compute the shortest path to each node.
1021
    void run(Node s)
1022
    {
1023
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1024
      if (Base::_pred)
1025
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1026
      if (Base::_dist)
1027
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1028
      if (Base::_reached)
1029
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1030
      if (Base::_processed)
1031
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1032
      if (s!=INVALID)
1033
        alg.run(s);
1034
      else
1035
        alg.run();
1036
    }
1037

	
1038
    ///Finds the shortest path between \c s and \c t.
1039

	
1040
    ///This method runs BFS algorithm from node \c s
1041
    ///in order to compute the shortest path to node \c t
1042
    ///(it stops searching when \c t is processed).
1043
    ///
1044
    ///\return \c true if \c t is reachable form \c s.
1045
    bool run(Node s, Node t)
1046
    {
1047
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1048
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1049
      if (Base::_pred)
1050
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1051
      if (Base::_dist)
1052
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1053
      if (Base::_reached)
1054
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1055
      if (Base::_processed)
1056
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1057
      alg.run(s,t);
1058
      if (Base::_path)
1059
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
1060
      if (Base::_di)
1061
        *Base::_di = alg.dist(t);
1062
      return alg.reached(t);
1063
    }
1064

	
1065
    ///Runs BFS algorithm to visit all nodes in the digraph.
1066

	
1067
    ///This method runs BFS algorithm in order to compute
1068
    ///the shortest path to each node.
1031 1069
    void run()
1032 1070
    {
1033
      if(Base::_source==INVALID) throw UninitializedParameter();
1034
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1035
      if(Base::_reached)
1036
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
1037
      if(Base::_processed)
1038
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1039
      if(Base::_pred)
1040
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1041
      if(Base::_dist)
1042
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1043
      alg.run(Base::_source);
1044
    }
1045

	
1046
    ///Runs BFS algorithm from the given node.
1047

	
1048
    ///Runs BFS algorithm from the given node.
1049
    ///\param s is the given source.
1050
    void run(Node s)
1051
    {
1052
      Base::_source=s;
1053
      run();
1054
    }
1055

	
1056
    /// Sets the source node, from which the Bfs algorithm runs.
1057

	
1058
    /// Sets the source node, from which the Bfs algorithm runs.
1059
    /// \param s is the source node.
1060
    BfsWizard<TR> &source(Node s)
1061
    {
1062
      Base::_source=s;
1063
      return *this;
1071
      run(INVALID);
1064 1072
    }
1065 1073

	
1066 1074
    template<class T>
1067 1075
    struct SetPredMapBase : public Base {
1068 1076
      typedef T PredMap;
1069 1077
      static PredMap *createPredMap(const Digraph &) { return 0; };
1070 1078
      SetPredMapBase(const TR &b) : TR(b) {}
1071 1079
    };
1072
    ///\brief \ref named-templ-param "Named parameter"
1080
    ///\brief \ref named-func-param "Named parameter"
1073 1081
    ///for setting \ref PredMap object.
1074 1082
    ///
1075
    /// \ref named-templ-param "Named parameter"
1083
    ///\ref named-func-param "Named parameter"
1076 1084
    ///for setting \ref PredMap object.
1077 1085
    template<class T>
1078 1086
    BfsWizard<SetPredMapBase<T> > predMap(const T &t)
1079 1087
    {
1080 1088
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1081 1089
      return BfsWizard<SetPredMapBase<T> >(*this);
1082 1090
    }
1083 1091

	
1084 1092
    template<class T>
1085 1093
    struct SetReachedMapBase : public Base {
1086 1094
      typedef T ReachedMap;
1087 1095
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1088 1096
      SetReachedMapBase(const TR &b) : TR(b) {}
1089 1097
    };
1090
    ///\brief \ref named-templ-param "Named parameter"
1098
    ///\brief \ref named-func-param "Named parameter"
1091 1099
    ///for setting \ref ReachedMap object.
1092 1100
    ///
1093
    /// \ref named-templ-param "Named parameter"
1101
    /// \ref named-func-param "Named parameter"
1094 1102
    ///for setting \ref ReachedMap object.
1095 1103
    template<class T>
1096 1104
    BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1097 1105
    {
1098 1106
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1099 1107
      return BfsWizard<SetReachedMapBase<T> >(*this);
1100 1108
    }
1101 1109

	
1102 1110
    template<class T>
1111
    struct SetDistMapBase : public Base {
1112
      typedef T DistMap;
1113
      static DistMap *createDistMap(const Digraph &) { return 0; };
1114
      SetDistMapBase(const TR &b) : TR(b) {}
1115
    };
1116
    ///\brief \ref named-func-param "Named parameter"
1117
    ///for setting \ref DistMap object.
1118
    ///
1119
    /// \ref named-func-param "Named parameter"
1120
    ///for setting \ref DistMap object.
1121
    template<class T>
1122
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1123
    {
1124
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1125
      return BfsWizard<SetDistMapBase<T> >(*this);
1126
    }
1127

	
1128
    template<class T>
1103 1129
    struct SetProcessedMapBase : public Base {
1104 1130
      typedef T ProcessedMap;
1105 1131
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1106 1132
      SetProcessedMapBase(const TR &b) : TR(b) {}
1107 1133
    };
1108
    ///\brief \ref named-templ-param "Named parameter"
1134
    ///\brief \ref named-func-param "Named parameter"
1109 1135
    ///for setting \ref ProcessedMap object.
1110 1136
    ///
1111
    /// \ref named-templ-param "Named parameter"
1137
    /// \ref named-func-param "Named parameter"
1112 1138
    ///for setting \ref ProcessedMap object.
1113 1139
    template<class T>
1114 1140
    BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1115 1141
    {
1116 1142
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1117 1143
      return BfsWizard<SetProcessedMapBase<T> >(*this);
1118 1144
    }
1119 1145

	
1120 1146
    template<class T>
1121
    struct SetDistMapBase : public Base {
1122
      typedef T DistMap;
1123
      static DistMap *createDistMap(const Digraph &) { return 0; };
1124
      SetDistMapBase(const TR &b) : TR(b) {}
1147
    struct SetPathBase : public Base {
1148
      typedef T Path;
1149
      SetPathBase(const TR &b) : TR(b) {}
1125 1150
    };
1126
    ///\brief \ref named-templ-param "Named parameter"
1127
    ///for setting \ref DistMap object.
1151
    ///\brief \ref named-func-param "Named parameter"
1152
    ///for getting the shortest path to the target node.
1128 1153
    ///
1129
    /// \ref named-templ-param "Named parameter"
1130
    ///for setting \ref DistMap object.
1154
    ///\ref named-func-param "Named parameter"
1155
    ///for getting the shortest path to the target node.
1131 1156
    template<class T>
1132
    BfsWizard<SetDistMapBase<T> > distMap(const T &t)
1157
    BfsWizard<SetPathBase<T> > path(const T &t)
1133 1158
    {
1134
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1135
      return BfsWizard<SetDistMapBase<T> >(*this);
1159
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1160
      return BfsWizard<SetPathBase<T> >(*this);
1161
    }
1162

	
1163
    ///\brief \ref named-func-param "Named parameter"
1164
    ///for getting the distance of the target node.
1165
    ///
1166
    ///\ref named-func-param "Named parameter"
1167
    ///for getting the distance of the target node.
1168
    BfsWizard dist(const int &d)
1169
    {
1170
      Base::_di=const_cast<int*>(&d);
1171
      return *this;
1136 1172
    }
1137 1173

	
1138 1174
  };
1139 1175

	
1140
  ///Function type interface for Bfs algorithm.
1176
  ///Function-type interface for BFS algorithm.
1141 1177

	
1142 1178
  /// \ingroup search
1143
  ///Function type interface for Bfs algorithm.
1179
  ///Function-type interface for BFS algorithm.
1144 1180
  ///
1145
  ///This function also has several
1146
  ///\ref named-templ-func-param "named parameters",
1181
  ///This function also has several \ref named-func-param "named parameters",
1147 1182
  ///they are declared as the members of class \ref BfsWizard.
1148
  ///The following
1149
  ///example shows how to use these parameters.
1183
  ///The following examples show how to use these parameters.
1150 1184
  ///\code
1151
  ///  bfs(g,source).predMap(preds).run();
1185
  ///  // Compute shortest path from node s to each node
1186
  ///  bfs(g).predMap(preds).distMap(dists).run(s);
1187
  ///
1188
  ///  // Compute shortest path from s to t
1189
  ///  bool reached = bfs(g).path(p).dist(d).run(s,t);
1152 1190
  ///\endcode
1153 1191
  ///\warning Don't forget to put the \ref BfsWizard::run() "run()"
1154 1192
  ///to the end of the parameter list.
1155 1193
  ///\sa BfsWizard
1156 1194
  ///\sa Bfs
1157 1195
  template<class GR>
1158 1196
  BfsWizard<BfsWizardBase<GR> >
1159
  bfs(const GR &g,typename GR::Node s=INVALID)
1197
  bfs(const GR &digraph)
1160 1198
  {
1161
    return BfsWizard<BfsWizardBase<GR> >(g,s);
1199
    return BfsWizard<BfsWizardBase<GR> >(digraph);
1162 1200
  }
1163 1201

	
1164 1202
#ifdef DOXYGEN
1165 1203
  /// \brief Visitor class for BFS.
1166 1204
  ///
1167 1205
  /// This class defines the interface of the BfsVisit events, and
1168 1206
  /// it could be the base of a real visitor class.
1169 1207
  template <typename _Digraph>
1170 1208
  struct BfsVisitor {
1171 1209
    typedef _Digraph Digraph;
1172 1210
    typedef typename Digraph::Arc Arc;
1173 1211
    typedef typename Digraph::Node Node;
1174 1212
    /// \brief Called for the source node(s) of the BFS.
1175 1213
    ///
1176 1214
    /// This function is called for the source node(s) of the BFS.
1177 1215
    void start(const Node& node) {}
1178 1216
    /// \brief Called when a node is reached first time.
1179 1217
    ///
1180 1218
    /// This function is called when a node is reached first time.
1181 1219
    void reach(const Node& node) {}
1182 1220
    /// \brief Called when a node is processed.
1183 1221
    ///
1184 1222
    /// This function is called when a node is processed.
1185 1223
    void process(const Node& node) {}
1186 1224
    /// \brief Called when an arc reaches a new node.
1187 1225
    ///
1188 1226
    /// This function is called when the BFS finds an arc whose target node
1189 1227
    /// is not reached yet.
1190 1228
    void discover(const Arc& arc) {}
1191 1229
    /// \brief Called when an arc is examined but its target node is
1192 1230
    /// already discovered.
1193 1231
    ///
1194 1232
    /// This function is called when an arc is examined but its target node is
1195 1233
    /// already discovered.
1196 1234
    void examine(const Arc& arc) {}
1197 1235
  };
1198 1236
#else
1199 1237
  template <typename _Digraph>
1200 1238
  struct BfsVisitor {
1201 1239
    typedef _Digraph Digraph;
1202 1240
    typedef typename Digraph::Arc Arc;
1203 1241
    typedef typename Digraph::Node Node;
1204 1242
    void start(const Node&) {}
1205 1243
    void reach(const Node&) {}
1206 1244
    void process(const Node&) {}
1207 1245
    void discover(const Arc&) {}
1208 1246
    void examine(const Arc&) {}
1209 1247

	
1210 1248
    template <typename _Visitor>
1211 1249
    struct Constraints {
1212 1250
      void constraints() {
1213 1251
        Arc arc;
1214 1252
        Node node;
1215 1253
        visitor.start(node);
1216 1254
        visitor.reach(node);
1217 1255
        visitor.process(node);
1218 1256
        visitor.discover(arc);
1219 1257
        visitor.examine(arc);
1220 1258
      }
1221 1259
      _Visitor& visitor;
1222 1260
    };
1223 1261
  };
1224 1262
#endif
1225 1263

	
1226 1264
  /// \brief Default traits class of BfsVisit class.
1227 1265
  ///
1228 1266
  /// Default traits class of BfsVisit class.
1229 1267
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1230 1268
  template<class _Digraph>
1231 1269
  struct BfsVisitDefaultTraits {
1232 1270

	
1233 1271
    /// \brief The type of the digraph the algorithm runs on.
1234 1272
    typedef _Digraph Digraph;
1235 1273

	
1236 1274
    /// \brief The type of the map that indicates which nodes are reached.
1237 1275
    ///
1238 1276
    /// The type of the map that indicates which nodes are reached.
1239 1277
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1240 1278
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1241 1279

	
1242 1280
    /// \brief Instantiates a \ref ReachedMap.
1243 1281
    ///
1244 1282
    /// This function instantiates a \ref ReachedMap.
1245 1283
    /// \param digraph is the digraph, to which
1246 1284
    /// we would like to define the \ref ReachedMap.
1247 1285
    static ReachedMap *createReachedMap(const Digraph &digraph) {
1248 1286
      return new ReachedMap(digraph);
1249 1287
    }
1250 1288

	
1251 1289
  };
1252 1290

	
1253 1291
  /// \ingroup search
1254 1292
  ///
1255 1293
  /// \brief %BFS algorithm class with visitor interface.
1256 1294
  ///
1257 1295
  /// This class provides an efficient implementation of the %BFS algorithm
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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
///\ingroup concept
20 20
///\file
21 21
///\brief Classes for representing paths in digraphs.
22 22
///
23 23
///\todo Iterators have obsolete style
24 24

	
25 25
#ifndef LEMON_CONCEPT_PATH_H
26 26
#define LEMON_CONCEPT_PATH_H
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/concept_check.h>
30 30

	
31 31
namespace lemon {
32 32
  namespace concepts {
33 33

	
34 34
    /// \addtogroup concept
35 35
    /// @{
36 36

	
37 37
    /// \brief A skeleton structure for representing directed paths in
38 38
    /// a digraph.
39 39
    ///
40 40
    /// A skeleton structure for representing directed paths in a
41 41
    /// digraph.
42 42
    /// \tparam _Digraph The digraph type in which the path is.
43 43
    ///
44 44
    /// In a sense, the path can be treated as a list of arcs. The
45 45
    /// lemon path type stores just this list. As a consequence it
46 46
    /// cannot enumerate the nodes in the path and the zero length
47 47
    /// paths cannot store the source.
48 48
    ///
49 49
    template <typename _Digraph>
50 50
    class Path {
51 51
    public:
52 52

	
53 53
      /// Type of the underlying digraph.
54 54
      typedef _Digraph Digraph;
55 55
      /// Arc type of the underlying digraph.
56 56
      typedef typename Digraph::Arc Arc;
57 57

	
58 58
      class ArcIt;
59 59

	
60 60
      /// \brief Default constructor
61 61
      Path() {}
62 62

	
63 63
      /// \brief Template constructor
64 64
      template <typename CPath>
65 65
      Path(const CPath& cpath) {}
66 66

	
67 67
      /// \brief Template assigment
68 68
      template <typename CPath>
69
      Path& operator=(const CPath& cpath) {}
69
      Path& operator=(const CPath& cpath) {
70
        ignore_unused_variable_warning(cpath);
71
        return *this;
72
      }
70 73

	
71 74
      /// Length of the path ie. the number of arcs in the path.
72 75
      int length() const { return 0;}
73 76

	
74 77
      /// Returns whether the path is empty.
75 78
      bool empty() const { return true;}
76 79

	
77 80
      /// Resets the path to an empty path.
78 81
      void clear() {}
79 82

	
80 83
      /// \brief LEMON style iterator for path arcs
81 84
      ///
82 85
      /// This class is used to iterate on the arcs of the paths.
83 86
      class ArcIt {
84 87
      public:
85 88
        /// Default constructor
86 89
        ArcIt() {}
87 90
        /// Invalid constructor
88 91
        ArcIt(Invalid) {}
89 92
        /// Constructor for first arc
90 93
        ArcIt(const Path &) {}
91 94

	
92 95
        /// Conversion to Arc
93 96
        operator Arc() const { return INVALID; }
94 97

	
95 98
        /// Next arc
96 99
        ArcIt& operator++() {return *this;}
97 100

	
98 101
        /// Comparison operator
99 102
        bool operator==(const ArcIt&) const {return true;}
100 103
        /// Comparison operator
101 104
        bool operator!=(const ArcIt&) const {return true;}
102 105
        /// Comparison operator
103 106
        bool operator<(const ArcIt&) const {return false;}
104 107

	
105 108
      };
106 109

	
107 110
      template <typename _Path>
108 111
      struct Constraints {
109 112
        void constraints() {
110 113
          Path<Digraph> pc;
111 114
          _Path p, pp(pc);
112 115
          int l = p.length();
113 116
          int e = p.empty();
114 117
          p.clear();
115 118

	
116 119
          p = pc;
117 120

	
118 121
          typename _Path::ArcIt id, ii(INVALID), i(p);
119 122

	
120 123
          ++i;
121 124
          typename Digraph::Arc ed = i;
122 125

	
123 126
          e = (i == ii);
124 127
          e = (i != ii);
125 128
          e = (i < ii);
126 129

	
127 130
          ignore_unused_variable_warning(l);
128 131
          ignore_unused_variable_warning(pp);
129 132
          ignore_unused_variable_warning(e);
130 133
          ignore_unused_variable_warning(id);
131 134
          ignore_unused_variable_warning(ii);
132 135
          ignore_unused_variable_warning(ed);
133 136
        }
134 137
      };
135 138

	
136 139
    };
137 140

	
138 141
    namespace _path_bits {
139 142

	
140 143
      template <typename _Digraph, typename _Path, typename RevPathTag = void>
141 144
      struct PathDumperConstraints {
142 145
        void constraints() {
143 146
          int l = p.length();
144 147
          int e = p.empty();
145 148

	
146 149
          typename _Path::ArcIt id, i(p);
147 150

	
148 151
          ++i;
149 152
          typename _Digraph::Arc ed = i;
150 153

	
151 154
          e = (i == INVALID);
152 155
          e = (i != INVALID);
153 156

	
154 157
          ignore_unused_variable_warning(l);
155 158
          ignore_unused_variable_warning(e);
156 159
          ignore_unused_variable_warning(id);
157 160
          ignore_unused_variable_warning(ed);
158 161
        }
159 162
        _Path& p;
160 163
      };
161 164

	
162 165
      template <typename _Digraph, typename _Path>
163 166
      struct PathDumperConstraints<
164 167
        _Digraph, _Path,
165 168
        typename enable_if<typename _Path::RevPathTag, void>::type
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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/assert.h>
31 31
#include <lemon/maps.h>
32
#include <lemon/path.h>
32 33

	
33 34
namespace lemon {
34 35

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

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

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

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

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

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

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

	
83 84
    ///The type of the map that indicates which nodes are reached.
84 85

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

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

	
98 99
    ///The type of the map that stores the distances of the nodes.
99 100

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

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

	
114 115
  ///%DFS algorithm class.
115 116

	
116 117
  ///\ingroup search
117 118
  ///This class provides an efficient implementation of the %DFS algorithm.
118 119
  ///
119
  ///There is also a \ref dfs() "function type interface" for the DFS
120
  ///There is also a \ref dfs() "function-type interface" for the DFS
120 121
  ///algorithm, which is convenient in the simplier cases and it can be
121 122
  ///used easier.
122 123
  ///
123 124
  ///\tparam GR The type of the digraph the algorithm runs on.
124 125
  ///The default value is \ref ListDigraph. The value of GR is not used
125 126
  ///directly by \ref Dfs, it is only passed to \ref DfsDefaultTraits.
126 127
  ///\tparam TR Traits class to set various data types used by the algorithm.
127 128
  ///The default traits class is
128 129
  ///\ref DfsDefaultTraits "DfsDefaultTraits<GR>".
129 130
  ///See \ref DfsDefaultTraits for the documentation of
130 131
  ///a Dfs traits class.
131 132
#ifdef DOXYGEN
132 133
  template <typename GR,
133 134
            typename TR>
134 135
#else
135 136
  template <typename GR=ListDigraph,
136 137
            typename TR=DfsDefaultTraits<GR> >
137 138
#endif
138 139
  class Dfs {
139 140
  public:
140 141
    ///\ref Exception for uninitialized parameters.
141 142

	
142 143
    ///This error represents problems in the initialization of the
143 144
    ///parameters of the algorithm.
144 145
    class UninitializedParameter : public lemon::UninitializedParameter {
145 146
    public:
146 147
      virtual const char* what() const throw() {
147 148
        return "lemon::Dfs::UninitializedParameter";
148 149
      }
149 150
    };
150 151

	
151 152
    ///The type of the digraph the algorithm runs on.
152 153
    typedef typename TR::Digraph Digraph;
153 154

	
154 155
    ///\brief The type of the map that stores the predecessor arcs of the
155 156
    ///DFS paths.
156 157
    typedef typename TR::PredMap PredMap;
157 158
    ///The type of the map that stores the distances of the nodes.
158 159
    typedef typename TR::DistMap DistMap;
159 160
    ///The type of the map that indicates which nodes are reached.
160 161
    typedef typename TR::ReachedMap ReachedMap;
161 162
    ///The type of the map that indicates which nodes are processed.
162 163
    typedef typename TR::ProcessedMap ProcessedMap;
163 164
    ///The type of the paths.
164 165
    typedef PredMapPath<Digraph, PredMap> Path;
165 166

	
166 167
    ///The traits class.
167 168
    typedef TR Traits;
168 169

	
169 170
  private:
170 171

	
171 172
    typedef typename Digraph::Node Node;
172 173
    typedef typename Digraph::NodeIt NodeIt;
173 174
    typedef typename Digraph::Arc Arc;
174 175
    typedef typename Digraph::OutArcIt OutArcIt;
175 176

	
176 177
    //Pointer to the underlying digraph.
177 178
    const Digraph *G;
178 179
    //Pointer to the map of predecessor arcs.
179 180
    PredMap *_pred;
180 181
    //Indicates if _pred is locally allocated (true) or not.
181 182
    bool local_pred;
182 183
    //Pointer to the map of distances.
183 184
    DistMap *_dist;
184 185
    //Indicates if _dist is locally allocated (true) or not.
185 186
    bool local_dist;
186 187
    //Pointer to the map of reached status of the nodes.
187 188
    ReachedMap *_reached;
188 189
    //Indicates if _reached is locally allocated (true) or not.
189 190
    bool local_reached;
190 191
    //Pointer to the map of processed status of the nodes.
191 192
    ProcessedMap *_processed;
192 193
    //Indicates if _processed is locally allocated (true) or not.
193 194
    bool local_processed;
194 195

	
195 196
    std::vector<typename Digraph::OutArcIt> _stack;
196 197
    int _stack_head;
197 198

	
198 199
    ///Creates the maps if necessary.
199 200
    ///\todo Better memory allocation (instead of new).
200 201
    void create_maps()
201 202
    {
202 203
      if(!_pred) {
203 204
        local_pred = true;
204 205
        _pred = Traits::createPredMap(*G);
205 206
      }
206 207
      if(!_dist) {
207 208
        local_dist = true;
208 209
        _dist = Traits::createDistMap(*G);
209 210
      }
210 211
      if(!_reached) {
211 212
        local_reached = true;
212 213
        _reached = Traits::createReachedMap(*G);
213 214
      }
214 215
      if(!_processed) {
215 216
        local_processed = true;
... ...
@@ -682,511 +683,548 @@
682 683
    ///The DFS path to a node.
683 684

	
684 685
    ///Returns the DFS path to a node.
685 686
    ///
686 687
    ///\warning \c t should be reachable from the root.
687 688
    ///
688 689
    ///\pre Either \ref run() or \ref start() must be called before
689 690
    ///using this function.
690 691
    Path path(Node t) const { return Path(*G, *_pred, t); }
691 692

	
692 693
    ///The distance of a node from the root.
693 694

	
694 695
    ///Returns the distance of a node from the root.
695 696
    ///
696 697
    ///\warning If node \c v is not reachable from the root, then
697 698
    ///the return value of this function is undefined.
698 699
    ///
699 700
    ///\pre Either \ref run() or \ref start() must be called before
700 701
    ///using this function.
701 702
    int dist(Node v) const { return (*_dist)[v]; }
702 703

	
703 704
    ///Returns the 'previous arc' of the %DFS tree for a node.
704 705

	
705 706
    ///This function returns the 'previous arc' of the %DFS tree for the
706 707
    ///node \c v, i.e. it returns the last arc of a %DFS path from the
707 708
    ///root to \c v. It is \c INVALID
708 709
    ///if \c v is not reachable from the root(s) or if \c v is a root.
709 710
    ///
710 711
    ///The %DFS tree used here is equal to the %DFS tree used in
711 712
    ///\ref predNode().
712 713
    ///
713 714
    ///\pre Either \ref run() or \ref start() must be called before using
714 715
    ///this function.
715 716
    Arc predArc(Node v) const { return (*_pred)[v];}
716 717

	
717 718
    ///Returns the 'previous node' of the %DFS tree.
718 719

	
719 720
    ///This function returns the 'previous node' of the %DFS
720 721
    ///tree for the node \c v, i.e. it returns the last but one node
721 722
    ///from a %DFS path from the root to \c v. It is \c INVALID
722 723
    ///if \c v is not reachable from the root(s) or if \c v is a root.
723 724
    ///
724 725
    ///The %DFS tree used here is equal to the %DFS tree used in
725 726
    ///\ref predArc().
726 727
    ///
727 728
    ///\pre Either \ref run() or \ref start() must be called before
728 729
    ///using this function.
729 730
    Node predNode(Node v) const { return (*_pred)[v]==INVALID ? INVALID:
730 731
                                  G->source((*_pred)[v]); }
731 732

	
732 733
    ///\brief Returns a const reference to the node map that stores the
733 734
    ///distances of the nodes.
734 735
    ///
735 736
    ///Returns a const reference to the node map that stores the
736 737
    ///distances of the nodes calculated by the algorithm.
737 738
    ///
738 739
    ///\pre Either \ref run() or \ref init()
739 740
    ///must be called before using this function.
740 741
    const DistMap &distMap() const { return *_dist;}
741 742

	
742 743
    ///\brief Returns a const reference to the node map that stores the
743 744
    ///predecessor arcs.
744 745
    ///
745 746
    ///Returns a const reference to the node map that stores the predecessor
746 747
    ///arcs, which form the DFS tree.
747 748
    ///
748 749
    ///\pre Either \ref run() or \ref init()
749 750
    ///must be called before using this function.
750 751
    const PredMap &predMap() const { return *_pred;}
751 752

	
752 753
    ///Checks if a node is reachable from the root(s).
753 754

	
754 755
    ///Returns \c true if \c v is reachable from the root(s).
755 756
    ///\pre Either \ref run() or \ref start()
756 757
    ///must be called before using this function.
757 758
    bool reached(Node v) const { return (*_reached)[v]; }
758 759

	
759 760
    ///@}
760 761
  };
761 762

	
762 763
  ///Default traits class of dfs() function.
763 764

	
764 765
  ///Default traits class of dfs() function.
765 766
  ///\tparam GR Digraph type.
766 767
  template<class GR>
767 768
  struct DfsWizardDefaultTraits
768 769
  {
769 770
    ///The type of the digraph the algorithm runs on.
770 771
    typedef GR Digraph;
771 772

	
772 773
    ///\brief The type of the map that stores the predecessor
773 774
    ///arcs of the %DFS paths.
774 775
    ///
775 776
    ///The type of the map that stores the predecessor
776 777
    ///arcs of the %DFS paths.
777 778
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
778
    ///
779
    typedef NullMap<typename Digraph::Node,typename Digraph::Arc> PredMap;
779
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
780 780
    ///Instantiates a \ref PredMap.
781 781

	
782 782
    ///This function instantiates a \ref PredMap.
783 783
    ///\param g is the digraph, to which we would like to define the
784 784
    ///\ref PredMap.
785 785
    ///\todo The digraph alone may be insufficient to initialize
786
#ifdef DOXYGEN
787 786
    static PredMap *createPredMap(const Digraph &g)
788
#else
789
    static PredMap *createPredMap(const Digraph &)
790
#endif
791 787
    {
792
      return new PredMap();
788
      return new PredMap(g);
793 789
    }
794 790

	
795 791
    ///The type of the map that indicates which nodes are processed.
796 792

	
797 793
    ///The type of the map that indicates which nodes are processed.
798 794
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
795
    ///By default it is a NullMap.
799 796
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
800 797
    ///Instantiates a \ref ProcessedMap.
801 798

	
802 799
    ///This function instantiates a \ref ProcessedMap.
803 800
    ///\param g is the digraph, to which
804 801
    ///we would like to define the \ref ProcessedMap.
805 802
#ifdef DOXYGEN
806 803
    static ProcessedMap *createProcessedMap(const Digraph &g)
807 804
#else
808 805
    static ProcessedMap *createProcessedMap(const Digraph &)
809 806
#endif
810 807
    {
811 808
      return new ProcessedMap();
812 809
    }
813 810

	
814 811
    ///The type of the map that indicates which nodes are reached.
815 812

	
816 813
    ///The type of the map that indicates which nodes are reached.
817 814
    ///It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
818 815
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
819 816
    ///Instantiates a \ref ReachedMap.
820 817

	
821 818
    ///This function instantiates a \ref ReachedMap.
822 819
    ///\param g is the digraph, to which
823 820
    ///we would like to define the \ref ReachedMap.
824 821
    static ReachedMap *createReachedMap(const Digraph &g)
825 822
    {
826 823
      return new ReachedMap(g);
827 824
    }
828 825

	
829 826
    ///The type of the map that stores the distances of the nodes.
830 827

	
831 828
    ///The type of the map that stores the distances of the nodes.
832 829
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
833
    ///
834
    typedef NullMap<typename Digraph::Node,int> DistMap;
830
    typedef typename Digraph::template NodeMap<int> DistMap;
835 831
    ///Instantiates a \ref DistMap.
836 832

	
837 833
    ///This function instantiates a \ref DistMap.
838 834
    ///\param g is the digraph, to which we would like to define
839 835
    ///the \ref DistMap
840
#ifdef DOXYGEN
841 836
    static DistMap *createDistMap(const Digraph &g)
842
#else
843
    static DistMap *createDistMap(const Digraph &)
844
#endif
845 837
    {
846
      return new DistMap();
838
      return new DistMap(g);
847 839
    }
840

	
841
    ///The type of the DFS paths.
842

	
843
    ///The type of the DFS paths.
844
    ///It must meet the \ref concepts::Path "Path" concept.
845
    typedef lemon::Path<Digraph> Path;
848 846
  };
849 847

	
850 848
  /// Default traits class used by \ref DfsWizard
851 849

	
852 850
  /// To make it easier to use Dfs algorithm
853 851
  /// we have created a wizard class.
854 852
  /// This \ref DfsWizard class needs default traits,
855 853
  /// as well as the \ref Dfs class.
856 854
  /// The \ref DfsWizardBase is a class to be the default traits of the
857 855
  /// \ref DfsWizard class.
858 856
  template<class GR>
859 857
  class DfsWizardBase : public DfsWizardDefaultTraits<GR>
860 858
  {
861 859

	
862 860
    typedef DfsWizardDefaultTraits<GR> Base;
863 861
  protected:
864 862
    //The type of the nodes in the digraph.
865 863
    typedef typename Base::Digraph::Node Node;
866 864

	
867 865
    //Pointer to the digraph the algorithm runs on.
868 866
    void *_g;
869 867
    //Pointer to the map of reached nodes.
870 868
    void *_reached;
871 869
    //Pointer to the map of processed nodes.
872 870
    void *_processed;
873 871
    //Pointer to the map of predecessors arcs.
874 872
    void *_pred;
875 873
    //Pointer to the map of distances.
876 874
    void *_dist;
877
    //Pointer to the source node.
878
    Node _source;
875
    //Pointer to the DFS path to the target node.
876
    void *_path;
877
    //Pointer to the distance of the target node.
878
    int *_di;
879 879

	
880 880
    public:
881 881
    /// Constructor.
882 882

	
883 883
    /// This constructor does not require parameters, therefore it initiates
884
    /// all of the attributes to default values (0, INVALID).
884
    /// all of the attributes to \c 0.
885 885
    DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0),
886
                      _dist(0), _source(INVALID) {}
886
                      _dist(0), _path(0), _di(0) {}
887 887

	
888 888
    /// Constructor.
889 889

	
890
    /// This constructor requires some parameters,
891
    /// listed in the parameters list.
892
    /// Others are initiated to 0.
890
    /// This constructor requires one parameter,
891
    /// others are initiated to \c 0.
893 892
    /// \param g The digraph the algorithm runs on.
894
    /// \param s The source node.
895
    DfsWizardBase(const GR &g, Node s=INVALID) :
893
    DfsWizardBase(const GR &g) :
896 894
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
897
      _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {}
895
      _reached(0), _processed(0), _pred(0), _dist(0),  _path(0), _di(0) {}
898 896

	
899 897
  };
900 898

	
901
  /// Auxiliary class for the function type interface of DFS algorithm.
899
  /// Auxiliary class for the function-type interface of DFS algorithm.
902 900

	
903
  /// This auxiliary class is created to implement the function type
904
  /// interface of \ref Dfs algorithm. It uses the functions and features
905
  /// of the plain \ref Dfs, but it is much simpler to use it.
906
  /// It should only be used through the \ref dfs() function, which makes
907
  /// it easier to use the algorithm.
901
  /// This auxiliary class is created to implement the
902
  /// \ref dfs() "function-type interface" of \ref Dfs algorithm.
903
  /// It does not have own \ref run() method, it uses the functions
904
  /// and features of the plain \ref Dfs.
908 905
  ///
909
  /// Simplicity means that the way to change the types defined
910
  /// in the traits class is based on functions that returns the new class
911
  /// and not on templatable built-in classes.
912
  /// When using the plain \ref Dfs
913
  /// the new class with the modified type comes from
914
  /// the original class by using the ::
915
  /// operator. In the case of \ref DfsWizard only
916
  /// a function have to be called, and it will
917
  /// return the needed class.
918
  ///
919
  /// It does not have own \ref run() method. When its \ref run() method
920
  /// is called, it initiates a plain \ref Dfs object, and calls the
921
  /// \ref Dfs::run() method of it.
906
  /// This class should only be used through the \ref dfs() function,
907
  /// which makes it easier to use the algorithm.
922 908
  template<class TR>
923 909
  class DfsWizard : public TR
924 910
  {
925 911
    typedef TR Base;
926 912

	
927 913
    ///The type of the digraph the algorithm runs on.
928 914
    typedef typename TR::Digraph Digraph;
929 915

	
930 916
    typedef typename Digraph::Node Node;
931 917
    typedef typename Digraph::NodeIt NodeIt;
932 918
    typedef typename Digraph::Arc Arc;
933 919
    typedef typename Digraph::OutArcIt OutArcIt;
934 920

	
935 921
    ///\brief The type of the map that stores the predecessor
936
    ///arcs of the shortest paths.
922
    ///arcs of the DFS paths.
937 923
    typedef typename TR::PredMap PredMap;
938 924
    ///\brief The type of the map that stores the distances of the nodes.
939 925
    typedef typename TR::DistMap DistMap;
940 926
    ///\brief The type of the map that indicates which nodes are reached.
941 927
    typedef typename TR::ReachedMap ReachedMap;
942 928
    ///\brief The type of the map that indicates which nodes are processed.
943 929
    typedef typename TR::ProcessedMap ProcessedMap;
930
    ///The type of the DFS paths
931
    typedef typename TR::Path Path;
944 932

	
945 933
  public:
946 934

	
947 935
    /// Constructor.
948 936
    DfsWizard() : TR() {}
949 937

	
950 938
    /// Constructor that requires parameters.
951 939

	
952 940
    /// Constructor that requires parameters.
953 941
    /// These parameters will be the default values for the traits class.
954
    DfsWizard(const Digraph &g, Node s=INVALID) :
955
      TR(g,s) {}
942
    /// \param g The digraph the algorithm runs on.
943
    DfsWizard(const Digraph &g) :
944
      TR(g) {}
956 945

	
957 946
    ///Copy constructor
958 947
    DfsWizard(const TR &b) : TR(b) {}
959 948

	
960 949
    ~DfsWizard() {}
961 950

	
962
    ///Runs DFS algorithm from a source node.
951
    ///Runs DFS algorithm from the given source node.
963 952

	
964
    ///Runs DFS algorithm from a source node.
965
    ///The node can be given with the \ref source() function.
953
    ///This method runs DFS algorithm from node \c s
954
    ///in order to compute the DFS path to each node.
955
    void run(Node s)
956
    {
957
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
958
      if (Base::_pred)
959
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
960
      if (Base::_dist)
961
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
962
      if (Base::_reached)
963
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
964
      if (Base::_processed)
965
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
966
      if (s!=INVALID)
967
        alg.run(s);
968
      else
969
        alg.run();
970
    }
971

	
972
    ///Finds the DFS path between \c s and \c t.
973

	
974
    ///This method runs DFS algorithm from node \c s
975
    ///in order to compute the DFS path to node \c t
976
    ///(it stops searching when \c t is processed).
977
    ///
978
    ///\return \c true if \c t is reachable form \c s.
979
    bool run(Node s, Node t)
980
    {
981
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
982
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
983
      if (Base::_pred)
984
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
985
      if (Base::_dist)
986
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
987
      if (Base::_reached)
988
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
989
      if (Base::_processed)
990
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
991
      alg.run(s,t);
992
      if (Base::_path)
993
        *reinterpret_cast<Path*>(Base::_path) = alg.path(t);
994
      if (Base::_di)
995
        *Base::_di = alg.dist(t);
996
      return alg.reached(t);
997
      }
998

	
999
    ///Runs DFS algorithm to visit all nodes in the digraph.
1000

	
1001
    ///This method runs DFS algorithm in order to compute
1002
    ///the DFS path to each node.
966 1003
    void run()
967 1004
    {
968
      if(Base::_source==INVALID) throw UninitializedParameter();
969
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
970
      if(Base::_reached)
971
        alg.reachedMap(*reinterpret_cast<ReachedMap*>(Base::_reached));
972
      if(Base::_processed)
973
        alg.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
974
      if(Base::_pred)
975
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
976
      if(Base::_dist)
977
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
978
      alg.run(Base::_source);
979
    }
980

	
981
    ///Runs DFS algorithm from the given node.
982

	
983
    ///Runs DFS algorithm from the given node.
984
    ///\param s is the given source.
985
    void run(Node s)
986
    {
987
      Base::_source=s;
988
      run();
989
    }
990

	
991
    /// Sets the source node, from which the Dfs algorithm runs.
992

	
993
    /// Sets the source node, from which the Dfs algorithm runs.
994
    /// \param s is the source node.
995
    DfsWizard<TR> &source(Node s)
996
    {
997
      Base::_source=s;
998
      return *this;
1005
      run(INVALID);
999 1006
    }
1000 1007

	
1001 1008
    template<class T>
1002 1009
    struct SetPredMapBase : public Base {
1003 1010
      typedef T PredMap;
1004 1011
      static PredMap *createPredMap(const Digraph &) { return 0; };
1005 1012
      SetPredMapBase(const TR &b) : TR(b) {}
1006 1013
    };
1007
    ///\brief \ref named-templ-param "Named parameter"
1014
    ///\brief \ref named-func-param "Named parameter"
1008 1015
    ///for setting \ref PredMap object.
1009 1016
    ///
1010
    ///\ref named-templ-param "Named parameter"
1017
    ///\ref named-func-param "Named parameter"
1011 1018
    ///for setting \ref PredMap object.
1012 1019
    template<class T>
1013 1020
    DfsWizard<SetPredMapBase<T> > predMap(const T &t)
1014 1021
    {
1015 1022
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1016 1023
      return DfsWizard<SetPredMapBase<T> >(*this);
1017 1024
    }
1018 1025

	
1019 1026
    template<class T>
1020 1027
    struct SetReachedMapBase : public Base {
1021 1028
      typedef T ReachedMap;
1022 1029
      static ReachedMap *createReachedMap(const Digraph &) { return 0; };
1023 1030
      SetReachedMapBase(const TR &b) : TR(b) {}
1024 1031
    };
1025
    ///\brief \ref named-templ-param "Named parameter"
1032
    ///\brief \ref named-func-param "Named parameter"
1026 1033
    ///for setting \ref ReachedMap object.
1027 1034
    ///
1028
    /// \ref named-templ-param "Named parameter"
1035
    /// \ref named-func-param "Named parameter"
1029 1036
    ///for setting \ref ReachedMap object.
1030 1037
    template<class T>
1031 1038
    DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t)
1032 1039
    {
1033 1040
      Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t));
1034 1041
      return DfsWizard<SetReachedMapBase<T> >(*this);
1035 1042
    }
1036 1043

	
1037 1044
    template<class T>
1045
    struct SetDistMapBase : public Base {
1046
      typedef T DistMap;
1047
      static DistMap *createDistMap(const Digraph &) { return 0; };
1048
      SetDistMapBase(const TR &b) : TR(b) {}
1049
    };
1050
    ///\brief \ref named-func-param "Named parameter"
1051
    ///for setting \ref DistMap object.
1052
    ///
1053
    /// \ref named-func-param "Named parameter"
1054
    ///for setting \ref DistMap object.
1055
    template<class T>
1056
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1057
    {
1058
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1059
      return DfsWizard<SetDistMapBase<T> >(*this);
1060
    }
1061

	
1062
    template<class T>
1038 1063
    struct SetProcessedMapBase : public Base {
1039 1064
      typedef T ProcessedMap;
1040 1065
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1041 1066
      SetProcessedMapBase(const TR &b) : TR(b) {}
1042 1067
    };
1043
    ///\brief \ref named-templ-param "Named parameter"
1068
    ///\brief \ref named-func-param "Named parameter"
1044 1069
    ///for setting \ref ProcessedMap object.
1045 1070
    ///
1046
    /// \ref named-templ-param "Named parameter"
1071
    /// \ref named-func-param "Named parameter"
1047 1072
    ///for setting \ref ProcessedMap object.
1048 1073
    template<class T>
1049 1074
    DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1050 1075
    {
1051 1076
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1052 1077
      return DfsWizard<SetProcessedMapBase<T> >(*this);
1053 1078
    }
1054 1079

	
1055 1080
    template<class T>
1056
    struct SetDistMapBase : public Base {
1057
      typedef T DistMap;
1058
      static DistMap *createDistMap(const Digraph &) { return 0; };
1059
      SetDistMapBase(const TR &b) : TR(b) {}
1081
    struct SetPathBase : public Base {
1082
      typedef T Path;
1083
      SetPathBase(const TR &b) : TR(b) {}
1060 1084
    };
1061
    ///\brief \ref named-templ-param "Named parameter"
1062
    ///for setting \ref DistMap object.
1085
    ///\brief \ref named-func-param "Named parameter"
1086
    ///for getting the DFS path to the target node.
1063 1087
    ///
1064
    ///\ref named-templ-param "Named parameter"
1065
    ///for setting \ref DistMap object.
1088
    ///\ref named-func-param "Named parameter"
1089
    ///for getting the DFS path to the target node.
1066 1090
    template<class T>
1067
    DfsWizard<SetDistMapBase<T> > distMap(const T &t)
1091
    DfsWizard<SetPathBase<T> > path(const T &t)
1068 1092
    {
1069
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1070
      return DfsWizard<SetDistMapBase<T> >(*this);
1093
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1094
      return DfsWizard<SetPathBase<T> >(*this);
1095
    }
1096

	
1097
    ///\brief \ref named-func-param "Named parameter"
1098
    ///for getting the distance of the target node.
1099
    ///
1100
    ///\ref named-func-param "Named parameter"
1101
    ///for getting the distance of the target node.
1102
    DfsWizard dist(const int &d)
1103
    {
1104
      Base::_di=const_cast<int*>(&d);
1105
      return *this;
1071 1106
    }
1072 1107

	
1073 1108
  };
1074 1109

	
1075
  ///Function type interface for Dfs algorithm.
1110
  ///Function-type interface for DFS algorithm.
1076 1111

	
1077 1112
  ///\ingroup search
1078
  ///Function type interface for Dfs algorithm.
1113
  ///Function-type interface for DFS algorithm.
1079 1114
  ///
1080
  ///This function also has several
1081
  ///\ref named-templ-func-param "named parameters",
1115
  ///This function also has several \ref named-func-param "named parameters",
1082 1116
  ///they are declared as the members of class \ref DfsWizard.
1083
  ///The following
1084
  ///example shows how to use these parameters.
1117
  ///The following examples show how to use these parameters.
1085 1118
  ///\code
1086
  ///  dfs(g,source).predMap(preds).run();
1119
  ///  // Compute the DFS tree
1120
  ///  dfs(g).predMap(preds).distMap(dists).run(s);
1121
  ///
1122
  ///  // Compute the DFS path from s to t
1123
  ///  bool reached = dfs(g).path(p).dist(d).run(s,t);
1087 1124
  ///\endcode
1125

	
1088 1126
  ///\warning Don't forget to put the \ref DfsWizard::run() "run()"
1089 1127
  ///to the end of the parameter list.
1090 1128
  ///\sa DfsWizard
1091 1129
  ///\sa Dfs
1092 1130
  template<class GR>
1093 1131
  DfsWizard<DfsWizardBase<GR> >
1094
  dfs(const GR &g,typename GR::Node s=INVALID)
1132
  dfs(const GR &digraph)
1095 1133
  {
1096
    return DfsWizard<DfsWizardBase<GR> >(g,s);
1134
    return DfsWizard<DfsWizardBase<GR> >(digraph);
1097 1135
  }
1098 1136

	
1099 1137
#ifdef DOXYGEN
1100 1138
  /// \brief Visitor class for DFS.
1101 1139
  ///
1102 1140
  /// This class defines the interface of the DfsVisit events, and
1103 1141
  /// it could be the base of a real visitor class.
1104 1142
  template <typename _Digraph>
1105 1143
  struct DfsVisitor {
1106 1144
    typedef _Digraph Digraph;
1107 1145
    typedef typename Digraph::Arc Arc;
1108 1146
    typedef typename Digraph::Node Node;
1109 1147
    /// \brief Called for the source node of the DFS.
1110 1148
    ///
1111 1149
    /// This function is called for the source node of the DFS.
1112 1150
    void start(const Node& node) {}
1113 1151
    /// \brief Called when the source node is leaved.
1114 1152
    ///
1115 1153
    /// This function is called when the source node is leaved.
1116 1154
    void stop(const Node& node) {}
1117 1155
    /// \brief Called when a node is reached first time.
1118 1156
    ///
1119 1157
    /// This function is called when a node is reached first time.
1120 1158
    void reach(const Node& node) {}
1121 1159
    /// \brief Called when an arc reaches a new node.
1122 1160
    ///
1123 1161
    /// This function is called when the DFS finds an arc whose target node
1124 1162
    /// is not reached yet.
1125 1163
    void discover(const Arc& arc) {}
1126 1164
    /// \brief Called when an arc is examined but its target node is
1127 1165
    /// already discovered.
1128 1166
    ///
1129 1167
    /// This function is called when an arc is examined but its target node is
1130 1168
    /// already discovered.
1131 1169
    void examine(const Arc& arc) {}
1132 1170
    /// \brief Called when the DFS steps back from a node.
1133 1171
    ///
1134 1172
    /// This function is called when the DFS steps back from a node.
1135 1173
    void leave(const Node& node) {}
1136 1174
    /// \brief Called when the DFS steps back on an arc.
1137 1175
    ///
1138 1176
    /// This function is called when the DFS steps back on an arc.
1139 1177
    void backtrack(const Arc& arc) {}
1140 1178
  };
1141 1179
#else
1142 1180
  template <typename _Digraph>
1143 1181
  struct DfsVisitor {
1144 1182
    typedef _Digraph Digraph;
1145 1183
    typedef typename Digraph::Arc Arc;
1146 1184
    typedef typename Digraph::Node Node;
1147 1185
    void start(const Node&) {}
1148 1186
    void stop(const Node&) {}
1149 1187
    void reach(const Node&) {}
1150 1188
    void discover(const Arc&) {}
1151 1189
    void examine(const Arc&) {}
1152 1190
    void leave(const Node&) {}
1153 1191
    void backtrack(const Arc&) {}
1154 1192

	
1155 1193
    template <typename _Visitor>
1156 1194
    struct Constraints {
1157 1195
      void constraints() {
1158 1196
        Arc arc;
1159 1197
        Node node;
1160 1198
        visitor.start(node);
1161 1199
        visitor.stop(arc);
1162 1200
        visitor.reach(node);
1163 1201
        visitor.discover(arc);
1164 1202
        visitor.examine(arc);
1165 1203
        visitor.leave(node);
1166 1204
        visitor.backtrack(arc);
1167 1205
      }
1168 1206
      _Visitor& visitor;
1169 1207
    };
1170 1208
  };
1171 1209
#endif
1172 1210

	
1173 1211
  /// \brief Default traits class of DfsVisit class.
1174 1212
  ///
1175 1213
  /// Default traits class of DfsVisit class.
1176 1214
  /// \tparam _Digraph The type of the digraph the algorithm runs on.
1177 1215
  template<class _Digraph>
1178 1216
  struct DfsVisitDefaultTraits {
1179 1217

	
1180 1218
    /// \brief The type of the digraph the algorithm runs on.
1181 1219
    typedef _Digraph Digraph;
1182 1220

	
1183 1221
    /// \brief The type of the map that indicates which nodes are reached.
1184 1222
    ///
1185 1223
    /// The type of the map that indicates which nodes are reached.
1186 1224
    /// It must meet the \ref concepts::ReadWriteMap "ReadWriteMap" concept.
1187 1225
    typedef typename Digraph::template NodeMap<bool> ReachedMap;
1188 1226

	
1189 1227
    /// \brief Instantiates a \ref ReachedMap.
1190 1228
    ///
1191 1229
    /// This function instantiates a \ref ReachedMap.
1192 1230
    /// \param digraph is the digraph, to which
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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_DIJKSTRA_H
20 20
#define LEMON_DIJKSTRA_H
21 21

	
22 22
///\ingroup shortest_path
23 23
///\file
24 24
///\brief Dijkstra algorithm.
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
#include <lemon/path.h>
33 34

	
34 35
namespace lemon {
35 36

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

	
56 57
  /// \brief Widest path operation traits for the Dijkstra algorithm class.
57 58
  ///
58 59
  /// This operation traits class defines all computational operations and
59 60
  /// constants which are used in the Dijkstra algorithm for widest path
60 61
  /// computation.
61 62
  ///
62 63
  /// \see DijkstraDefaultOperationTraits
63 64
  template <typename Value>
64 65
  struct DijkstraWidestPathOperationTraits {
65 66
    /// \brief Gives back the maximum value of the type.
66 67
    static Value zero() {
67 68
      return std::numeric_limits<Value>::max();
68 69
    }
69 70
    /// \brief Gives back the minimum of the given two elements.
70 71
    static Value plus(const Value& left, const Value& right) {
71 72
      return std::min(left, right);
72 73
    }
73 74
    /// \brief Gives back true only if the first value is less than the second.
74 75
    static bool less(const Value& left, const Value& right) {
75 76
      return left < right;
76 77
    }
77 78
  };
78 79

	
79 80
  ///Default traits class of Dijkstra class.
80 81

	
81 82
  ///Default traits class of Dijkstra class.
82 83
  ///\tparam GR The type of the digraph.
83 84
  ///\tparam LM The type of the length map.
84 85
  template<class GR, class LM>
85 86
  struct DijkstraDefaultTraits
86 87
  {
87 88
    ///The type of the digraph the algorithm runs on.
88 89
    typedef GR Digraph;
89 90

	
90 91
    ///The type of the map that stores the arc lengths.
91 92

	
92 93
    ///The type of the map that stores the arc lengths.
93 94
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
94 95
    typedef LM LengthMap;
95 96
    ///The type of the length of the arcs.
96 97
    typedef typename LM::Value Value;
97 98

	
98 99
    /// Operation traits for Dijkstra algorithm.
99 100

	
100 101
    /// This class defines the operations that are used in the algorithm.
101 102
    /// \see DijkstraDefaultOperationTraits
102 103
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
103 104

	
104 105
    /// The cross reference type used by the heap.
105 106

	
106 107
    /// The cross reference type used by the heap.
107 108
    /// Usually it is \c Digraph::NodeMap<int>.
108 109
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
109 110
    ///Instantiates a \ref HeapCrossRef.
110 111

	
111 112
    ///This function instantiates a \ref HeapCrossRef.
112 113
    /// \param g is the digraph, to which we would like to define the
113 114
    /// \ref HeapCrossRef.
114 115
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
115 116
    {
116 117
      return new HeapCrossRef(g);
117 118
    }
118 119

	
119 120
    ///The heap type used by the Dijkstra algorithm.
120 121

	
121 122
    ///The heap type used by the Dijkstra algorithm.
122 123
    ///
123 124
    ///\sa BinHeap
124 125
    ///\sa Dijkstra
125 126
    typedef BinHeap<typename LM::Value, HeapCrossRef, std::less<Value> > Heap;
126 127
    ///Instantiates a \ref Heap.
127 128

	
128 129
    ///This function instantiates a \ref Heap.
129 130
    static Heap *createHeap(HeapCrossRef& r)
130 131
    {
131 132
      return new Heap(r);
132 133
    }
133 134

	
134 135
    ///\brief The type of the map that stores the predecessor
135 136
    ///arcs of the shortest paths.
136 137
    ///
137 138
    ///The type of the map that stores the predecessor
138 139
    ///arcs of the shortest paths.
139 140
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
140 141
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
141 142
    ///Instantiates a \ref PredMap.
142 143

	
143 144
    ///This function instantiates a \ref PredMap.
144 145
    ///\param g is the digraph, to which we would like to define the
145 146
    ///\ref PredMap.
146 147
    ///\todo The digraph alone may be insufficient for the initialization
147 148
    static PredMap *createPredMap(const Digraph &g)
148 149
    {
149 150
      return new PredMap(g);
150 151
    }
151 152

	
152 153
    ///The type of the map that indicates which nodes are processed.
153 154

	
154 155
    ///The type of the map that indicates which nodes are processed.
155 156
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
156 157
    ///By default it is a NullMap.
157 158
    ///\todo If it is set to a real map,
158 159
    ///Dijkstra::processed() should read this.
159 160
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
160 161
    ///Instantiates a \ref ProcessedMap.
161 162

	
162 163
    ///This function instantiates a \ref ProcessedMap.
163 164
    ///\param g is the digraph, to which
164 165
    ///we would like to define the \ref ProcessedMap
165 166
#ifdef DOXYGEN
166 167
    static ProcessedMap *createProcessedMap(const Digraph &g)
167 168
#else
168 169
    static ProcessedMap *createProcessedMap(const Digraph &)
169 170
#endif
170 171
    {
171 172
      return new ProcessedMap();
172 173
    }
173 174

	
174 175
    ///The type of the map that stores the distances of the nodes.
175 176

	
176 177
    ///The type of the map that stores the distances of the nodes.
177 178
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
178 179
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
179 180
    ///Instantiates a \ref DistMap.
180 181

	
181 182
    ///This function instantiates a \ref DistMap.
182 183
    ///\param g is the digraph, to which we would like to define
183 184
    ///the \ref DistMap
184 185
    static DistMap *createDistMap(const Digraph &g)
185 186
    {
186 187
      return new DistMap(g);
187 188
    }
188 189
  };
189 190

	
190 191
  ///%Dijkstra algorithm class.
191 192

	
192 193
  /// \ingroup shortest_path
193 194
  ///This class provides an efficient implementation of the %Dijkstra algorithm.
194 195
  ///
195 196
  ///The arc lengths are passed to the algorithm using a
196 197
  ///\ref concepts::ReadMap "ReadMap",
197 198
  ///so it is easy to change it to any kind of length.
198 199
  ///The type of the length is determined by the
199 200
  ///\ref concepts::ReadMap::Value "Value" of the length map.
200 201
  ///It is also possible to change the underlying priority heap.
201 202
  ///
202
  ///There is also a \ref dijkstra() "function type interface" for the
203
  ///There is also a \ref dijkstra() "function-type interface" for the
203 204
  ///%Dijkstra algorithm, which is convenient in the simplier cases and
204 205
  ///it can be used easier.
205 206
  ///
206 207
  ///\tparam GR The type of the digraph the algorithm runs on.
207 208
  ///The default value is \ref ListDigraph.
208 209
  ///The value of GR is not used directly by \ref Dijkstra, it is only
209 210
  ///passed to \ref DijkstraDefaultTraits.
210 211
  ///\tparam LM A readable arc map that determines the lengths of the
211 212
  ///arcs. It is read once for each arc, so the map may involve in
212 213
  ///relatively time consuming process to compute the arc lengths if
213 214
  ///it is necessary. The default map type is \ref
214 215
  ///concepts::Digraph::ArcMap "Digraph::ArcMap<int>".
215 216
  ///The value of LM is not used directly by \ref Dijkstra, it is only
216 217
  ///passed to \ref DijkstraDefaultTraits.
217 218
  ///\tparam TR Traits class to set various data types used by the algorithm.
218 219
  ///The default traits class is \ref DijkstraDefaultTraits
219 220
  ///"DijkstraDefaultTraits<GR,LM>". See \ref DijkstraDefaultTraits
220 221
  ///for the documentation of a Dijkstra traits class.
221 222
#ifdef DOXYGEN
222 223
  template <typename GR, typename LM, typename TR>
223 224
#else
224 225
  template <typename GR=ListDigraph,
225 226
            typename LM=typename GR::template ArcMap<int>,
226 227
            typename TR=DijkstraDefaultTraits<GR,LM> >
227 228
#endif
228 229
  class Dijkstra {
229 230
  public:
230 231
    ///\ref Exception for uninitialized parameters.
231 232

	
232 233
    ///This error represents problems in the initialization of the
233 234
    ///parameters of the algorithm.
234 235
    class UninitializedParameter : public lemon::UninitializedParameter {
235 236
    public:
236 237
      virtual const char* what() const throw() {
237 238
        return "lemon::Dijkstra::UninitializedParameter";
238 239
      }
239 240
    };
240 241

	
241 242
    ///The type of the digraph the algorithm runs on.
242 243
    typedef typename TR::Digraph Digraph;
243 244

	
244 245
    ///The type of the length of the arcs.
245 246
    typedef typename TR::LengthMap::Value Value;
246 247
    ///The type of the map that stores the arc lengths.
247 248
    typedef typename TR::LengthMap LengthMap;
248 249
    ///\brief The type of the map that stores the predecessor arcs of the
249 250
    ///shortest paths.
250 251
    typedef typename TR::PredMap PredMap;
251 252
    ///The type of the map that stores the distances of the nodes.
252 253
    typedef typename TR::DistMap DistMap;
253 254
    ///The type of the map that indicates which nodes are processed.
254 255
    typedef typename TR::ProcessedMap ProcessedMap;
255 256
    ///The type of the paths.
256 257
    typedef PredMapPath<Digraph, PredMap> Path;
257 258
    ///The cross reference type used for the current heap.
258 259
    typedef typename TR::HeapCrossRef HeapCrossRef;
259 260
    ///The heap type used by the algorithm.
260 261
    typedef typename TR::Heap Heap;
261 262
    ///The operation traits class.
262 263
    typedef typename TR::OperationTraits OperationTraits;
263 264

	
264 265
    ///The traits class.
265 266
    typedef TR Traits;
266 267

	
267 268
  private:
268 269

	
269 270
    typedef typename Digraph::Node Node;
270 271
    typedef typename Digraph::NodeIt NodeIt;
271 272
    typedef typename Digraph::Arc Arc;
272 273
    typedef typename Digraph::OutArcIt OutArcIt;
273 274

	
274 275
    //Pointer to the underlying digraph.
275 276
    const Digraph *G;
276 277
    //Pointer to the length map.
277 278
    const LengthMap *length;
278 279
    //Pointer to the map of predecessors arcs.
279 280
    PredMap *_pred;
280 281
    //Indicates if _pred is locally allocated (true) or not.
281 282
    bool local_pred;
282 283
    //Pointer to the map of distances.
283 284
    DistMap *_dist;
284 285
    //Indicates if _dist is locally allocated (true) or not.
285 286
    bool local_dist;
286 287
    //Pointer to the map of processed status of the nodes.
287 288
    ProcessedMap *_processed;
288 289
    //Indicates if _processed is locally allocated (true) or not.
289 290
    bool local_processed;
290 291
    //Pointer to the heap cross references.
291 292
    HeapCrossRef *_heap_cross_ref;
292 293
    //Indicates if _heap_cross_ref is locally allocated (true) or not.
293 294
    bool local_heap_cross_ref;
294 295
    //Pointer to the heap.
295 296
    Heap *_heap;
296 297
    //Indicates if _heap is locally allocated (true) or not.
297 298
    bool local_heap;
298 299

	
... ...
@@ -894,395 +895,422 @@
894 895
    ///\pre Either \ref run() or \ref init()
895 896
    ///must be called before using this function.
896 897
    const PredMap &predMap() const { return *_pred;}
897 898

	
898 899
    ///Checks if a node is reachable from the root(s).
899 900

	
900 901
    ///Returns \c true if \c v is reachable from the root(s).
901 902
    ///\pre Either \ref run() or \ref start()
902 903
    ///must be called before using this function.
903 904
    bool reached(Node v) const { return (*_heap_cross_ref)[v] !=
904 905
                                        Heap::PRE_HEAP; }
905 906

	
906 907
    ///Checks if a node is processed.
907 908

	
908 909
    ///Returns \c true if \c v is processed, i.e. the shortest
909 910
    ///path to \c v has already found.
910 911
    ///\pre Either \ref run() or \ref start()
911 912
    ///must be called before using this function.
912 913
    bool processed(Node v) const { return (*_heap_cross_ref)[v] ==
913 914
                                          Heap::POST_HEAP; }
914 915

	
915 916
    ///The current distance of a node from the root(s).
916 917

	
917 918
    ///Returns the current distance of a node from the root(s).
918 919
    ///It may be decreased in the following processes.
919 920
    ///\pre \c v should be reached but not processed.
920 921
    Value currentDist(Node v) const { return (*_heap)[v]; }
921 922

	
922 923
    ///@}
923 924
  };
924 925

	
925 926

	
926 927
  ///Default traits class of dijkstra() function.
927 928

	
928 929
  ///Default traits class of dijkstra() function.
929 930
  ///\tparam GR The type of the digraph.
930 931
  ///\tparam LM The type of the length map.
931 932
  template<class GR, class LM>
932 933
  struct DijkstraWizardDefaultTraits
933 934
  {
934 935
    ///The type of the digraph the algorithm runs on.
935 936
    typedef GR Digraph;
936 937
    ///The type of the map that stores the arc lengths.
937 938

	
938 939
    ///The type of the map that stores the arc lengths.
939 940
    ///It must meet the \ref concepts::ReadMap "ReadMap" concept.
940 941
    typedef LM LengthMap;
941 942
    ///The type of the length of the arcs.
942 943
    typedef typename LM::Value Value;
943 944

	
944 945
    /// Operation traits for Dijkstra algorithm.
945 946

	
946 947
    /// This class defines the operations that are used in the algorithm.
947 948
    /// \see DijkstraDefaultOperationTraits
948 949
    typedef DijkstraDefaultOperationTraits<Value> OperationTraits;
949 950

	
950 951
    /// The cross reference type used by the heap.
951 952

	
952 953
    /// The cross reference type used by the heap.
953 954
    /// Usually it is \c Digraph::NodeMap<int>.
954 955
    typedef typename Digraph::template NodeMap<int> HeapCrossRef;
955 956
    ///Instantiates a \ref HeapCrossRef.
956 957

	
957 958
    ///This function instantiates a \ref HeapCrossRef.
958 959
    /// \param g is the digraph, to which we would like to define the
959 960
    /// HeapCrossRef.
960 961
    /// \todo The digraph alone may be insufficient for the initialization
961 962
    static HeapCrossRef *createHeapCrossRef(const Digraph &g)
962 963
    {
963 964
      return new HeapCrossRef(g);
964 965
    }
965 966

	
966 967
    ///The heap type used by the Dijkstra algorithm.
967 968

	
968 969
    ///The heap type used by the Dijkstra algorithm.
969 970
    ///
970 971
    ///\sa BinHeap
971 972
    ///\sa Dijkstra
972 973
    typedef BinHeap<Value, typename Digraph::template NodeMap<int>,
973 974
                    std::less<Value> > Heap;
974 975

	
975 976
    ///Instantiates a \ref Heap.
976 977

	
977 978
    ///This function instantiates a \ref Heap.
978 979
    /// \param r is the HeapCrossRef which is used.
979 980
    static Heap *createHeap(HeapCrossRef& r)
980 981
    {
981 982
      return new Heap(r);
982 983
    }
983 984

	
984 985
    ///\brief The type of the map that stores the predecessor
985 986
    ///arcs of the shortest paths.
986 987
    ///
987 988
    ///The type of the map that stores the predecessor
988 989
    ///arcs of the shortest paths.
989 990
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
990
    typedef NullMap <typename Digraph::Node,typename Digraph::Arc> PredMap;
991
    typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;
991 992
    ///Instantiates a \ref PredMap.
992 993

	
993 994
    ///This function instantiates a \ref PredMap.
994 995
    ///\param g is the digraph, to which we would like to define the
995 996
    ///\ref PredMap.
996 997
    ///\todo The digraph alone may be insufficient to initialize
997
#ifdef DOXYGEN
998 998
    static PredMap *createPredMap(const Digraph &g)
999
#else
1000
    static PredMap *createPredMap(const Digraph &)
1001
#endif
1002 999
    {
1003
      return new PredMap();
1000
      return new PredMap(g);
1004 1001
    }
1005 1002

	
1006 1003
    ///The type of the map that indicates which nodes are processed.
1007 1004

	
1008 1005
    ///The type of the map that indicates which nodes are processed.
1009 1006
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1010 1007
    ///By default it is a NullMap.
1011 1008
    ///\todo If it is set to a real map,
1012 1009
    ///Dijkstra::processed() should read this.
1013 1010
    ///\todo named parameter to set this type, function to read and write.
1014 1011
    typedef NullMap<typename Digraph::Node,bool> ProcessedMap;
1015 1012
    ///Instantiates a \ref ProcessedMap.
1016 1013

	
1017 1014
    ///This function instantiates a \ref ProcessedMap.
1018 1015
    ///\param g is the digraph, to which
1019 1016
    ///we would like to define the \ref ProcessedMap.
1020 1017
#ifdef DOXYGEN
1021 1018
    static ProcessedMap *createProcessedMap(const Digraph &g)
1022 1019
#else
1023 1020
    static ProcessedMap *createProcessedMap(const Digraph &)
1024 1021
#endif
1025 1022
    {
1026 1023
      return new ProcessedMap();
1027 1024
    }
1028 1025

	
1029 1026
    ///The type of the map that stores the distances of the nodes.
1030 1027

	
1031 1028
    ///The type of the map that stores the distances of the nodes.
1032 1029
    ///It must meet the \ref concepts::WriteMap "WriteMap" concept.
1033
    typedef NullMap<typename Digraph::Node,Value> DistMap;
1030
    typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;
1034 1031
    ///Instantiates a \ref DistMap.
1035 1032

	
1036 1033
    ///This function instantiates a \ref DistMap.
1037 1034
    ///\param g is the digraph, to which we would like to define
1038 1035
    ///the \ref DistMap
1039
#ifdef DOXYGEN
1040 1036
    static DistMap *createDistMap(const Digraph &g)
1041
#else
1042
    static DistMap *createDistMap(const Digraph &)
1043
#endif
1044 1037
    {
1045
      return new DistMap();
1038
      return new DistMap(g);
1046 1039
    }
1040

	
1041
    ///The type of the shortest paths.
1042

	
1043
    ///The type of the shortest paths.
1044
    ///It must meet the \ref concepts::Path "Path" concept.
1045
    typedef lemon::Path<Digraph> Path;
1047 1046
  };
1048 1047

	
1049 1048
  /// Default traits class used by \ref DijkstraWizard
1050 1049

	
1051 1050
  /// To make it easier to use Dijkstra algorithm
1052 1051
  /// we have created a wizard class.
1053 1052
  /// This \ref DijkstraWizard class needs default traits,
1054 1053
  /// as well as the \ref Dijkstra class.
1055 1054
  /// The \ref DijkstraWizardBase is a class to be the default traits of the
1056 1055
  /// \ref DijkstraWizard class.
1057 1056
  /// \todo More named parameters are required...
1058 1057
  template<class GR,class LM>
1059 1058
  class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LM>
1060 1059
  {
1061 1060
    typedef DijkstraWizardDefaultTraits<GR,LM> Base;
1062 1061
  protected:
1063 1062
    //The type of the nodes in the digraph.
1064 1063
    typedef typename Base::Digraph::Node Node;
1065 1064

	
1066 1065
    //Pointer to the digraph the algorithm runs on.
1067 1066
    void *_g;
1068
    //Pointer to the length map
1067
    //Pointer to the length map.
1069 1068
    void *_length;
1070 1069
    //Pointer to the map of processed nodes.
1071 1070
    void *_processed;
1072 1071
    //Pointer to the map of predecessors arcs.
1073 1072
    void *_pred;
1074 1073
    //Pointer to the map of distances.
1075 1074
    void *_dist;
1076
    //Pointer to the source node.
1077
    Node _source;
1075
    //Pointer to the shortest path to the target node.
1076
    void *_path;
1077
    //Pointer to the distance of the target node.
1078
    void *_di;
1078 1079

	
1079 1080
  public:
1080 1081
    /// Constructor.
1081 1082

	
1082 1083
    /// This constructor does not require parameters, therefore it initiates
1083
    /// all of the attributes to default values (0, INVALID).
1084
    /// all of the attributes to \c 0.
1084 1085
    DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0),
1085
                           _dist(0), _source(INVALID) {}
1086
                           _dist(0), _path(0), _di(0) {}
1086 1087

	
1087 1088
    /// Constructor.
1088 1089

	
1089
    /// This constructor requires some parameters,
1090
    /// listed in the parameters list.
1091
    /// Others are initiated to 0.
1090
    /// This constructor requires two parameters,
1091
    /// others are initiated to \c 0.
1092 1092
    /// \param g The digraph the algorithm runs on.
1093 1093
    /// \param l The length map.
1094
    /// \param s The source node.
1095
    DijkstraWizardBase(const GR &g,const LM &l, Node s=INVALID) :
1094
    DijkstraWizardBase(const GR &g,const LM &l) :
1096 1095
      _g(reinterpret_cast<void*>(const_cast<GR*>(&g))),
1097 1096
      _length(reinterpret_cast<void*>(const_cast<LM*>(&l))),
1098
      _processed(0), _pred(0), _dist(0), _source(s) {}
1097
      _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}
1099 1098

	
1100 1099
  };
1101 1100

	
1102
  /// Auxiliary class for the function type interface of Dijkstra algorithm.
1101
  /// Auxiliary class for the function-type interface of Dijkstra algorithm.
1103 1102

	
1104
  /// This auxiliary class is created to implement the function type
1105
  /// interface of \ref Dijkstra algorithm. It uses the functions and features
1106
  /// of the plain \ref Dijkstra, but it is much simpler to use it.
1107
  /// It should only be used through the \ref dijkstra() function, which makes
1108
  /// it easier to use the algorithm.
1103
  /// This auxiliary class is created to implement the
1104
  /// \ref dijkstra() "function-type interface" of \ref Dijkstra algorithm.
1105
  /// It does not have own \ref run() method, it uses the functions
1106
  /// and features of the plain \ref Dijkstra.
1109 1107
  ///
1110
  /// Simplicity means that the way to change the types defined
1111
  /// in the traits class is based on functions that returns the new class
1112
  /// and not on templatable built-in classes.
1113
  /// When using the plain \ref Dijkstra
1114
  /// the new class with the modified type comes from
1115
  /// the original class by using the ::
1116
  /// operator. In the case of \ref DijkstraWizard only
1117
  /// a function have to be called, and it will
1118
  /// return the needed class.
1119
  ///
1120
  /// It does not have own \ref run() method. When its \ref run() method
1121
  /// is called, it initiates a plain \ref Dijkstra object, and calls the
1122
  /// \ref Dijkstra::run() method of it.
1108
  /// This class should only be used through the \ref dijkstra() function,
1109
  /// which makes it easier to use the algorithm.
1123 1110
  template<class TR>
1124 1111
  class DijkstraWizard : public TR
1125 1112
  {
1126 1113
    typedef TR Base;
1127 1114

	
1128 1115
    ///The type of the digraph the algorithm runs on.
1129 1116
    typedef typename TR::Digraph Digraph;
1130 1117

	
1131 1118
    typedef typename Digraph::Node Node;
1132 1119
    typedef typename Digraph::NodeIt NodeIt;
1133 1120
    typedef typename Digraph::Arc Arc;
1134 1121
    typedef typename Digraph::OutArcIt OutArcIt;
1135 1122

	
1136 1123
    ///The type of the map that stores the arc lengths.
1137 1124
    typedef typename TR::LengthMap LengthMap;
1138 1125
    ///The type of the length of the arcs.
1139 1126
    typedef typename LengthMap::Value Value;
1140 1127
    ///\brief The type of the map that stores the predecessor
1141 1128
    ///arcs of the shortest paths.
1142 1129
    typedef typename TR::PredMap PredMap;
1143 1130
    ///The type of the map that stores the distances of the nodes.
1144 1131
    typedef typename TR::DistMap DistMap;
1145 1132
    ///The type of the map that indicates which nodes are processed.
1146 1133
    typedef typename TR::ProcessedMap ProcessedMap;
1134
    ///The type of the shortest paths
1135
    typedef typename TR::Path Path;
1147 1136
    ///The heap type used by the dijkstra algorithm.
1148 1137
    typedef typename TR::Heap Heap;
1149 1138

	
1150 1139
  public:
1151 1140

	
1152 1141
    /// Constructor.
1153 1142
    DijkstraWizard() : TR() {}
1154 1143

	
1155 1144
    /// Constructor that requires parameters.
1156 1145

	
1157 1146
    /// Constructor that requires parameters.
1158 1147
    /// These parameters will be the default values for the traits class.
1159
    DijkstraWizard(const Digraph &g,const LengthMap &l, Node s=INVALID) :
1160
      TR(g,l,s) {}
1148
    /// \param g The digraph the algorithm runs on.
1149
    /// \param l The length map.
1150
    DijkstraWizard(const Digraph &g, const LengthMap &l) :
1151
      TR(g,l) {}
1161 1152

	
1162 1153
    ///Copy constructor
1163 1154
    DijkstraWizard(const TR &b) : TR(b) {}
1164 1155

	
1165 1156
    ~DijkstraWizard() {}
1166 1157

	
1167
    ///Runs Dijkstra algorithm from a source node.
1158
    ///Runs Dijkstra algorithm from the given source node.
1168 1159

	
1169
    ///Runs Dijkstra algorithm from a source node.
1170
    ///The node can be given with the \ref source() function.
1171
    void run()
1160
    ///This method runs %Dijkstra algorithm from the given source node
1161
    ///in order to compute the shortest path to each node.
1162
    void run(Node s)
1172 1163
    {
1173
      if(Base::_source==INVALID) throw UninitializedParameter();
1164
      if (s==INVALID) throw UninitializedParameter();
1174 1165
      Dijkstra<Digraph,LengthMap,TR>
1175
        dij(*reinterpret_cast<const Digraph*>(Base::_g),
1176
            *reinterpret_cast<const LengthMap*>(Base::_length));
1177
      if(Base::_processed)
1178
        dij.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1179
      if(Base::_pred)
1180
        dij.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1181
      if(Base::_dist)
1182
        dij.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1183
      dij.run(Base::_source);
1166
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1167
             *reinterpret_cast<const LengthMap*>(Base::_length));
1168
      if (Base::_pred)
1169
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1170
      if (Base::_dist)
1171
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1172
      if (Base::_processed)
1173
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1174
      dijk.run(s);
1184 1175
    }
1185 1176

	
1186
    ///Runs Dijkstra algorithm from the given node.
1177
    ///Finds the shortest path between \c s and \c t.
1187 1178

	
1188
    ///Runs Dijkstra algorithm from the given node.
1189
    ///\param s is the given source.
1190
    void run(Node s)
1179
    ///This method runs the %Dijkstra algorithm from node \c s
1180
    ///in order to compute the shortest path to node \c t
1181
    ///(it stops searching when \c t is processed).
1182
    ///
1183
    ///\return \c true if \c t is reachable form \c s.
1184
    bool run(Node s, Node t)
1191 1185
    {
1192
      Base::_source=s;
1193
      run();
1194
    }
1195

	
1196
    /// Sets the source node, from which the Dijkstra algorithm runs.
1197

	
1198
    /// Sets the source node, from which the Dijkstra algorithm runs.
1199
    /// \param s is the source node.
1200
    DijkstraWizard<TR> &source(Node s)
1201
    {
1202
      Base::_source=s;
1203
      return *this;
1186
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1187
      Dijkstra<Digraph,LengthMap,TR>
1188
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1189
             *reinterpret_cast<const LengthMap*>(Base::_length));
1190
      if (Base::_pred)
1191
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1192
      if (Base::_dist)
1193
        dijk.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1194
      if (Base::_processed)
1195
        dijk.processedMap(*reinterpret_cast<ProcessedMap*>(Base::_processed));
1196
      dijk.run(s,t);
1197
      if (Base::_path)
1198
        *reinterpret_cast<Path*>(Base::_path) = dijk.path(t);
1199
      if (Base::_di)
1200
        *reinterpret_cast<Value*>(Base::_di) = dijk.dist(t);
1201
      return dijk.reached(t);
1204 1202
    }
1205 1203

	
1206 1204
    template<class T>
1207 1205
    struct SetPredMapBase : public Base {
1208 1206
      typedef T PredMap;
1209 1207
      static PredMap *createPredMap(const Digraph &) { return 0; };
1210 1208
      SetPredMapBase(const TR &b) : TR(b) {}
1211 1209
    };
1212
    ///\brief \ref named-templ-param "Named parameter"
1210
    ///\brief \ref named-func-param "Named parameter"
1213 1211
    ///for setting \ref PredMap object.
1214 1212
    ///
1215
    ///\ref named-templ-param "Named parameter"
1213
    ///\ref named-func-param "Named parameter"
1216 1214
    ///for setting \ref PredMap object.
1217 1215
    template<class T>
1218 1216
    DijkstraWizard<SetPredMapBase<T> > predMap(const T &t)
1219 1217
    {
1220 1218
      Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t));
1221 1219
      return DijkstraWizard<SetPredMapBase<T> >(*this);
1222 1220
    }
1223 1221

	
1224 1222
    template<class T>
1223
    struct SetDistMapBase : public Base {
1224
      typedef T DistMap;
1225
      static DistMap *createDistMap(const Digraph &) { return 0; };
1226
      SetDistMapBase(const TR &b) : TR(b) {}
1227
    };
1228
    ///\brief \ref named-func-param "Named parameter"
1229
    ///for setting \ref DistMap object.
1230
    ///
1231
    ///\ref named-func-param "Named parameter"
1232
    ///for setting \ref DistMap object.
1233
    template<class T>
1234
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1235
    {
1236
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1237
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1238
    }
1239

	
1240
    template<class T>
1225 1241
    struct SetProcessedMapBase : public Base {
1226 1242
      typedef T ProcessedMap;
1227 1243
      static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };
1228 1244
      SetProcessedMapBase(const TR &b) : TR(b) {}
1229 1245
    };
1230
    ///\brief \ref named-templ-param "Named parameter"
1246
    ///\brief \ref named-func-param "Named parameter"
1231 1247
    ///for setting \ref ProcessedMap object.
1232 1248
    ///
1233
    /// \ref named-templ-param "Named parameter"
1249
    /// \ref named-func-param "Named parameter"
1234 1250
    ///for setting \ref ProcessedMap object.
1235 1251
    template<class T>
1236 1252
    DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)
1237 1253
    {
1238 1254
      Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));
1239 1255
      return DijkstraWizard<SetProcessedMapBase<T> >(*this);
1240 1256
    }
1241 1257

	
1242 1258
    template<class T>
1243
    struct SetDistMapBase : public Base {
1244
      typedef T DistMap;
1245
      static DistMap *createDistMap(const Digraph &) { return 0; };
1246
      SetDistMapBase(const TR &b) : TR(b) {}
1259
    struct SetPathBase : public Base {
1260
      typedef T Path;
1261
      SetPathBase(const TR &b) : TR(b) {}
1247 1262
    };
1248
    ///\brief \ref named-templ-param "Named parameter"
1249
    ///for setting \ref DistMap object.
1263
    ///\brief \ref named-func-param "Named parameter"
1264
    ///for getting the shortest path to the target node.
1250 1265
    ///
1251
    ///\ref named-templ-param "Named parameter"
1252
    ///for setting \ref DistMap object.
1266
    ///\ref named-func-param "Named parameter"
1267
    ///for getting the shortest path to the target node.
1253 1268
    template<class T>
1254
    DijkstraWizard<SetDistMapBase<T> > distMap(const T &t)
1269
    DijkstraWizard<SetPathBase<T> > path(const T &t)
1255 1270
    {
1256
      Base::_dist=reinterpret_cast<void*>(const_cast<T*>(&t));
1257
      return DijkstraWizard<SetDistMapBase<T> >(*this);
1271
      Base::_path=reinterpret_cast<void*>(const_cast<T*>(&t));
1272
      return DijkstraWizard<SetPathBase<T> >(*this);
1273
    }
1274

	
1275
    ///\brief \ref named-func-param "Named parameter"
1276
    ///for getting the distance of the target node.
1277
    ///
1278
    ///\ref named-func-param "Named parameter"
1279
    ///for getting the distance of the target node.
1280
    DijkstraWizard dist(const Value &d)
1281
    {
1282
      Base::_di=reinterpret_cast<void*>(const_cast<Value*>(&d));
1283
      return *this;
1258 1284
    }
1259 1285

	
1260 1286
  };
1261 1287

	
1262
  ///Function type interface for Dijkstra algorithm.
1288
  ///Function-type interface for Dijkstra algorithm.
1263 1289

	
1264 1290
  /// \ingroup shortest_path
1265
  ///Function type interface for Dijkstra algorithm.
1291
  ///Function-type interface for Dijkstra algorithm.
1266 1292
  ///
1267
  ///This function also has several
1268
  ///\ref named-templ-func-param "named parameters",
1293
  ///This function also has several \ref named-func-param "named parameters",
1269 1294
  ///they are declared as the members of class \ref DijkstraWizard.
1270
  ///The following
1271
  ///example shows how to use these parameters.
1295
  ///The following examples show how to use these parameters.
1272 1296
  ///\code
1273
  ///  dijkstra(g,length,source).predMap(preds).run();
1297
  ///  // Compute shortest path from node s to each node
1298
  ///  dijkstra(g,length).predMap(preds).distMap(dists).run(s);
1299
  ///
1300
  ///  // Compute shortest path from s to t
1301
  ///  bool reached = dijkstra(g,length).path(p).dist(d).run(s,t);
1274 1302
  ///\endcode
1275 1303
  ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()"
1276 1304
  ///to the end of the parameter list.
1277 1305
  ///\sa DijkstraWizard
1278 1306
  ///\sa Dijkstra
1279 1307
  template<class GR, class LM>
1280 1308
  DijkstraWizard<DijkstraWizardBase<GR,LM> >
1281
  dijkstra(const GR &g,const LM &l,typename GR::Node s=INVALID)
1309
  dijkstra(const GR &digraph, const LM &length)
1282 1310
  {
1283
    return DijkstraWizard<DijkstraWizardBase<GR,LM> >(g,l,s);
1311
    return DijkstraWizard<DijkstraWizardBase<GR,LM> >(digraph,length);
1284 1312
  }
1285 1313

	
1286 1314
} //END OF NAMESPACE LEMON
1287 1315

	
1288 1316
#endif
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/bfs.h>
24 24
#include <lemon/path.h>
25 25

	
26 26
#include "graph_test.h"
27 27
#include "test_tools.h"
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "5\n"
40 40
  "@arcs\n"
41 41
  "     label\n"
42 42
  "0 1  0\n"
43 43
  "1 2  1\n"
44 44
  "2 3  2\n"
45 45
  "3 4  3\n"
46 46
  "0 3  4\n"
47 47
  "0 3  5\n"
48 48
  "5 2  6\n"
49 49
  "@attributes\n"
50 50
  "source 0\n"
51 51
  "target 4\n";
52 52

	
53 53
void checkBfsCompile()
54 54
{
55 55
  typedef concepts::Digraph Digraph;
56 56
  typedef Bfs<Digraph> BType;
57 57

	
58 58
  Digraph G;
59 59
  Digraph::Node n;
60 60
  Digraph::Arc e;
61 61
  int l;
62 62
  bool b;
63 63
  BType::DistMap d(G);
64 64
  BType::PredMap p(G);
65
  //  BType::PredNodeMap pn(G);
66 65

	
67 66
  BType bfs_test(G);
68 67

	
69 68
  bfs_test.run(n);
70 69

	
71 70
  l  = bfs_test.dist(n);
72 71
  e  = bfs_test.predArc(n);
73 72
  n  = bfs_test.predNode(n);
74 73
  d  = bfs_test.distMap();
75

	
76 74
  p  = bfs_test.predMap();
77
  //  pn = bfs_test.predNodeMap();
78 75
  b  = bfs_test.reached(n);
79 76

	
80 77
  Path<Digraph> pp = bfs_test.path(n);
81 78
}
82 79

	
83 80
void checkBfsFunctionCompile()
84 81
{
85 82
  typedef int VType;
86 83
  typedef concepts::Digraph Digraph;
87 84
  typedef Digraph::Arc Arc;
88 85
  typedef Digraph::Node Node;
89 86

	
90 87
  Digraph g;
91
  bfs(g,Node()).run();
92
  bfs(g).source(Node()).run();
88
  bool b;
89
  bfs(g).run(Node());
90
  b=bfs(g).run(Node(),Node());
91
  bfs(g).run();
93 92
  bfs(g)
94
    .predMap(concepts::WriteMap<Node,Arc>())
95
    .distMap(concepts::WriteMap<Node,VType>())
93
    .predMap(concepts::ReadWriteMap<Node,Arc>())
94
    .distMap(concepts::ReadWriteMap<Node,VType>())
96 95
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
97 96
    .processedMap(concepts::WriteMap<Node,bool>())
98 97
    .run(Node());
98
  b=bfs(g)
99
    .predMap(concepts::ReadWriteMap<Node,Arc>())
100
    .distMap(concepts::ReadWriteMap<Node,VType>())
101
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
102
    .processedMap(concepts::WriteMap<Node,bool>())
103
    .path(concepts::Path<Digraph>())
104
    .dist(VType())
105
    .run(Node(),Node());
106
  bfs(g)
107
    .predMap(concepts::ReadWriteMap<Node,Arc>())
108
    .distMap(concepts::ReadWriteMap<Node,VType>())
109
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
110
    .processedMap(concepts::WriteMap<Node,bool>())
111
    .run();
99 112
}
100 113

	
101 114
template <class Digraph>
102 115
void checkBfs() {
103 116
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
104 117

	
105 118
  Digraph G;
106 119
  Node s, t;
107 120

	
108 121
  std::istringstream input(test_lgf);
109 122
  digraphReader(input, G).
110 123
    node("source", s).
111 124
    node("target", t).
112 125
    run();
113 126

	
114 127
  Bfs<Digraph> bfs_test(G);
115 128
  bfs_test.run(s);
116 129

	
117
  check(bfs_test.dist(t)==2,"Bfs found a wrong path." << bfs_test.dist(t));
130
  check(bfs_test.dist(t)==2,"Bfs found a wrong path.");
118 131

	
119 132
  Path<Digraph> p = bfs_test.path(t);
120 133
  check(p.length()==2,"path() found a wrong path.");
121 134
  check(checkPath(G, p),"path() found a wrong path.");
122 135
  check(pathSource(G, p) == s,"path() found a wrong path.");
123 136
  check(pathTarget(G, p) == t,"path() found a wrong path.");
124 137

	
125 138

	
126 139
  for(ArcIt a(G); a!=INVALID; ++a) {
127 140
    Node u=G.source(a);
128 141
    Node v=G.target(a);
129 142
    check( !bfs_test.reached(u) ||
130 143
           (bfs_test.dist(v) <= bfs_test.dist(u)+1),
131
           "Wrong output." << G.id(v) << ' ' << G.id(u));
144
           "Wrong output. " << G.id(u) << "->" << G.id(v));
132 145
  }
133 146

	
134 147
  for(NodeIt v(G); v!=INVALID; ++v) {
135 148
    if (bfs_test.reached(v)) {
136 149
      check(v==s || bfs_test.predArc(v)!=INVALID, "Wrong tree.");
137 150
      if (bfs_test.predArc(v)!=INVALID ) {
138 151
        Arc a=bfs_test.predArc(v);
139 152
        Node u=G.source(a);
140 153
        check(u==bfs_test.predNode(v),"Wrong tree.");
141 154
        check(bfs_test.dist(v) - bfs_test.dist(u) == 1,
142 155
              "Wrong distance. Difference: "
143
              << std::abs(bfs_test.dist(v) - bfs_test.dist(u)
144
                          - 1));
156
              << std::abs(bfs_test.dist(v) - bfs_test.dist(u) - 1));
145 157
      }
146 158
    }
147 159
  }
160

	
161
  {
162
    NullMap<Node,Arc> myPredMap;
163
    bfs(G).predMap(myPredMap).run(s);
164
  }
148 165
}
149 166

	
150 167
int main()
151 168
{
152 169
  checkBfs<ListDigraph>();
153 170
  checkBfs<SmartDigraph>();
154 171
  return 0;
155 172
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23

	
24 23
#include <lemon/dfs.h>
25 24
#include <lemon/path.h>
26 25

	
27 26
#include "graph_test.h"
28 27
#include "test_tools.h"
29 28

	
30 29
using namespace lemon;
31 30

	
32 31
char test_lgf[] =
33 32
  "@nodes\n"
34 33
  "label\n"
35 34
  "0\n"
36 35
  "1\n"
37 36
  "2\n"
38 37
  "3\n"
39 38
  "4\n"
40 39
  "5\n"
41 40
  "6\n"
42 41
  "@arcs\n"
43 42
  "     label\n"
44 43
  "0 1  0\n"
45 44
  "1 2  1\n"
46 45
  "2 3  2\n"
47 46
  "1 4  3\n"
48 47
  "4 2  4\n"
49 48
  "4 5  5\n"
50 49
  "5 0  6\n"
51 50
  "6 3  7\n"
52 51
  "@attributes\n"
53 52
  "source 0\n"
54 53
  "target 5\n";
55 54

	
56 55
void checkDfsCompile()
57 56
{
58 57
  typedef concepts::Digraph Digraph;
59 58
  typedef Dfs<Digraph> DType;
60 59

	
61 60
  Digraph G;
62 61
  Digraph::Node n;
63 62
  Digraph::Arc e;
64 63
  int l;
65 64
  bool b;
66 65
  DType::DistMap d(G);
67 66
  DType::PredMap p(G);
68 67

	
69 68
  DType dfs_test(G);
70 69

	
71 70
  dfs_test.run(n);
72 71

	
73 72
  l  = dfs_test.dist(n);
74 73
  e  = dfs_test.predArc(n);
75 74
  n  = dfs_test.predNode(n);
76 75
  d  = dfs_test.distMap();
77 76
  p  = dfs_test.predMap();
78 77
  b  = dfs_test.reached(n);
79 78

	
80 79
  Path<Digraph> pp = dfs_test.path(n);
81 80
}
82 81

	
83 82
void checkDfsFunctionCompile()
84 83
{
85 84
  typedef int VType;
86 85
  typedef concepts::Digraph Digraph;
87 86
  typedef Digraph::Arc Arc;
88 87
  typedef Digraph::Node Node;
89 88

	
90 89
  Digraph g;
91
  dfs(g,Node()).run();
92
  dfs(g).source(Node()).run();
90
  bool b;
91
  dfs(g).run(Node());
92
  b=dfs(g).run(Node(),Node());
93
  dfs(g).run();
93 94
  dfs(g)
94
    .predMap(concepts::WriteMap<Node,Arc>())
95
    .distMap(concepts::WriteMap<Node,VType>())
95
    .predMap(concepts::ReadWriteMap<Node,Arc>())
96
    .distMap(concepts::ReadWriteMap<Node,VType>())
96 97
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
97 98
    .processedMap(concepts::WriteMap<Node,bool>())
98 99
    .run(Node());
100
  b=dfs(g)
101
    .predMap(concepts::ReadWriteMap<Node,Arc>())
102
    .distMap(concepts::ReadWriteMap<Node,VType>())
103
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
104
    .processedMap(concepts::WriteMap<Node,bool>())
105
    .path(concepts::Path<Digraph>())
106
    .dist(VType())
107
    .run(Node(),Node());
108
  dfs(g)
109
    .predMap(concepts::ReadWriteMap<Node,Arc>())
110
    .distMap(concepts::ReadWriteMap<Node,VType>())
111
    .reachedMap(concepts::ReadWriteMap<Node,bool>())
112
    .processedMap(concepts::WriteMap<Node,bool>())
113
    .run();
99 114
}
100 115

	
101 116
template <class Digraph>
102 117
void checkDfs() {
103 118
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
104 119

	
105 120
  Digraph G;
106 121
  Node s, t;
107 122

	
108 123
  std::istringstream input(test_lgf);
109 124
  digraphReader(input, G).
110 125
    node("source", s).
111 126
    node("target", t).
112 127
    run();
113 128

	
114 129
  Dfs<Digraph> dfs_test(G);
115 130
  dfs_test.run(s);
116 131

	
117 132
  Path<Digraph> p = dfs_test.path(t);
118 133
  check(p.length() == dfs_test.dist(t),"path() found a wrong path.");
119 134
  check(checkPath(G, p),"path() found a wrong path.");
120 135
  check(pathSource(G, p) == s,"path() found a wrong path.");
121 136
  check(pathTarget(G, p) == t,"path() found a wrong path.");
122 137

	
123 138
  for(NodeIt v(G); v!=INVALID; ++v) {
124 139
    if (dfs_test.reached(v)) {
125 140
      check(v==s || dfs_test.predArc(v)!=INVALID, "Wrong tree.");
126 141
      if (dfs_test.predArc(v)!=INVALID ) {
127 142
        Arc e=dfs_test.predArc(v);
128 143
        Node u=G.source(e);
129 144
        check(u==dfs_test.predNode(v),"Wrong tree.");
130 145
        check(dfs_test.dist(v) - dfs_test.dist(u) == 1,
131 146
              "Wrong distance. (" << dfs_test.dist(u) << "->"
132
              <<dfs_test.dist(v) << ')');
147
              << dfs_test.dist(v) << ")");
133 148
      }
134 149
    }
135 150
  }
151

	
152
  {
153
    NullMap<Node,Arc> myPredMap;
154
    dfs(G).predMap(myPredMap).run(s);
155
  }
136 156
}
137 157

	
138 158
int main()
139 159
{
140 160
  checkDfs<ListDigraph>();
141 161
  checkDfs<SmartDigraph>();
142 162
  return 0;
143 163
}
Ignore white space 6 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
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
#include <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23

	
24 23
#include <lemon/dijkstra.h>
25 24
#include <lemon/path.h>
26 25

	
27 26
#include "graph_test.h"
28 27
#include "test_tools.h"
29 28

	
30 29
using namespace lemon;
31 30

	
32 31
char test_lgf[] =
33 32
  "@nodes\n"
34 33
  "label\n"
35 34
  "0\n"
36 35
  "1\n"
37 36
  "2\n"
38 37
  "3\n"
39 38
  "4\n"
40 39
  "@arcs\n"
41 40
  "     label length\n"
42 41
  "0 1  0     1\n"
43 42
  "1 2  1     1\n"
44 43
  "2 3  2     1\n"
45 44
  "0 3  4     5\n"
46 45
  "0 3  5     10\n"
47 46
  "0 3  6     7\n"
48 47
  "4 2  7     1\n"
49 48
  "@attributes\n"
50 49
  "source 0\n"
51 50
  "target 3\n";
52 51

	
53 52
void checkDijkstraCompile()
54 53
{
55 54
  typedef int VType;
56 55
  typedef concepts::Digraph Digraph;
57 56
  typedef concepts::ReadMap<Digraph::Arc,VType> LengthMap;
58 57
  typedef Dijkstra<Digraph, LengthMap> DType;
59 58

	
60 59
  Digraph G;
61 60
  Digraph::Node n;
62 61
  Digraph::Arc e;
63 62
  VType l;
64 63
  bool b;
65 64
  DType::DistMap d(G);
66 65
  DType::PredMap p(G);
67
  //  DType::PredNodeMap pn(G);
68 66
  LengthMap length;
69 67

	
70 68
  DType dijkstra_test(G,length);
71 69

	
72 70
  dijkstra_test.run(n);
73 71

	
74 72
  l  = dijkstra_test.dist(n);
75 73
  e  = dijkstra_test.predArc(n);
76 74
  n  = dijkstra_test.predNode(n);
77 75
  d  = dijkstra_test.distMap();
78 76
  p  = dijkstra_test.predMap();
79
  //  pn = dijkstra_test.predNodeMap();
80 77
  b  = dijkstra_test.reached(n);
81 78

	
82 79
  Path<Digraph> pp = dijkstra_test.path(n);
83 80
}
84 81

	
85 82
void checkDijkstraFunctionCompile()
86 83
{
87 84
  typedef int VType;
88 85
  typedef concepts::Digraph Digraph;
89 86
  typedef Digraph::Arc Arc;
90 87
  typedef Digraph::Node Node;
91 88
  typedef concepts::ReadMap<Digraph::Arc,VType> LengthMap;
92 89

	
93 90
  Digraph g;
94
  dijkstra(g,LengthMap(),Node()).run();
95
  dijkstra(g,LengthMap()).source(Node()).run();
91
  bool b;
92
  dijkstra(g,LengthMap()).run(Node());
93
  b=dijkstra(g,LengthMap()).run(Node(),Node());
96 94
  dijkstra(g,LengthMap())
97
    .predMap(concepts::WriteMap<Node,Arc>())
98
    .distMap(concepts::WriteMap<Node,VType>())
95
    .predMap(concepts::ReadWriteMap<Node,Arc>())
96
    .distMap(concepts::ReadWriteMap<Node,VType>())
97
    .processedMap(concepts::WriteMap<Node,bool>())
99 98
    .run(Node());
99
  b=dijkstra(g,LengthMap())
100
    .predMap(concepts::ReadWriteMap<Node,Arc>())
101
    .distMap(concepts::ReadWriteMap<Node,VType>())
102
    .processedMap(concepts::WriteMap<Node,bool>())
103
    .path(concepts::Path<Digraph>())
104
    .dist(VType())
105
    .run(Node(),Node());
100 106
}
101 107

	
102 108
template <class Digraph>
103 109
void checkDijkstra() {
104 110
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
105 111
  typedef typename Digraph::template ArcMap<int> LengthMap;
106 112

	
107 113
  Digraph G;
108 114
  Node s, t;
109 115
  LengthMap length(G);
110 116

	
111 117
  std::istringstream input(test_lgf);
112 118
  digraphReader(input, G).
113 119
    arcMap("length", length).
114 120
    node("source", s).
115 121
    node("target", t).
116 122
    run();
117 123

	
118 124
  Dijkstra<Digraph, LengthMap>
119 125
        dijkstra_test(G, length);
120 126
  dijkstra_test.run(s);
121 127

	
122 128
  check(dijkstra_test.dist(t)==3,"Dijkstra found a wrong path.");
123 129

	
124 130
  Path<Digraph> p = dijkstra_test.path(t);
125
  check(p.length()==3,"getPath() found a wrong path.");
131
  check(p.length()==3,"path() found a wrong path.");
126 132
  check(checkPath(G, p),"path() found a wrong path.");
127 133
  check(pathSource(G, p) == s,"path() found a wrong path.");
128 134
  check(pathTarget(G, p) == t,"path() found a wrong path.");
129 135

	
130 136
  for(ArcIt e(G); e!=INVALID; ++e) {
131 137
    Node u=G.source(e);
132 138
    Node v=G.target(e);
133 139
    check( !dijkstra_test.reached(u) ||
134 140
           (dijkstra_test.dist(v) - dijkstra_test.dist(u) <= length[e]),
135
           "dist(target)-dist(source)-arc_length= " <<
141
           "Wrong output. dist(target)-dist(source)-arc_length=" <<
136 142
           dijkstra_test.dist(v) - dijkstra_test.dist(u) - length[e]);
137 143
  }
138 144

	
139 145
  for(NodeIt v(G); v!=INVALID; ++v) {
140 146
    if (dijkstra_test.reached(v)) {
141 147
      check(v==s || dijkstra_test.predArc(v)!=INVALID, "Wrong tree.");
142 148
      if (dijkstra_test.predArc(v)!=INVALID ) {
143 149
        Arc e=dijkstra_test.predArc(v);
144 150
        Node u=G.source(e);
145 151
        check(u==dijkstra_test.predNode(v),"Wrong tree.");
146 152
        check(dijkstra_test.dist(v) - dijkstra_test.dist(u) == length[e],
147 153
              "Wrong distance! Difference: " <<
148 154
              std::abs(dijkstra_test.dist(v)-dijkstra_test.dist(u)-length[e]));
149 155
      }
150 156
    }
151 157
  }
152 158

	
153 159
  {
154 160
    NullMap<Node,Arc> myPredMap;
155 161
    dijkstra(G,length).predMap(myPredMap).run(s);
156 162
  }
157 163
}
158 164

	
159 165
int main() {
160 166
  checkDijkstra<ListDigraph>();
161 167
  checkDijkstra<SmartDigraph>();
162 168
  return 0;
163 169
}
0 comments (0 inline)