Changes in / [279:6307bbbf285b:277:7abfb55f1ecc] in lemon-1.2
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bfs.h
r278 r258 29 29 #include <lemon/error.h> 30 30 #include <lemon/maps.h> 31 #include <lemon/path.h>32 31 33 32 namespace lemon { … … 117 116 ///This class provides an efficient implementation of the %BFS algorithm. 118 117 /// 119 ///There is also a \ref bfs() "function -type interface" for the BFS118 ///There is also a \ref bfs() "function type interface" for the BFS 120 119 ///algorithm, which is convenient in the simplier cases and it can be 121 120 ///used easier. … … 843 842 ///arcs of the shortest paths. 844 843 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 845 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;844 typedef NullMap<typename Digraph::Node,typename Digraph::Arc> PredMap; 846 845 ///Instantiates a \ref PredMap. 847 846 … … 850 849 ///\ref PredMap. 851 850 ///\todo The digraph alone may be insufficient to initialize 851 #ifdef DOXYGEN 852 852 static PredMap *createPredMap(const Digraph &g) 853 { 854 return new PredMap(g); 853 #else 854 static PredMap *createPredMap(const Digraph &) 855 #endif 856 { 857 return new PredMap(); 855 858 } 856 859 … … 859 862 ///The type of the map that indicates which nodes are processed. 860 863 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 861 ///By default it is a NullMap.862 864 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 863 865 ///Instantiates a \ref ProcessedMap. … … 894 896 ///The type of the map that stores the distances of the nodes. 895 897 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 896 typedef typename Digraph::template NodeMap<int> DistMap; 898 /// 899 typedef NullMap<typename Digraph::Node,int> DistMap; 897 900 ///Instantiates a \ref DistMap. 898 901 … … 900 903 ///\param g is the digraph, to which we would like to define 901 904 ///the \ref DistMap 905 #ifdef DOXYGEN 902 906 static DistMap *createDistMap(const Digraph &g) 903 { 904 return new DistMap(g); 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; 907 #else 908 static DistMap *createDistMap(const Digraph &) 909 #endif 910 { 911 return new DistMap(); 912 } 912 913 }; 913 914 … … 939 940 //Pointer to the map of distances. 940 941 void *_dist; 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; 942 //Pointer to the source node. 943 Node _source; 945 944 946 945 public: … … 948 947 949 948 /// This constructor does not require parameters, therefore it initiates 950 /// all of the attributes to \c 0.949 /// all of the attributes to default values (0, INVALID). 951 950 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), 952 _dist(0), _ path(0), _di(0) {}951 _dist(0), _source(INVALID) {} 953 952 954 953 /// Constructor. 955 954 956 /// This constructor requires one parameter, 957 /// others are initiated to \c 0. 955 /// This constructor requires some parameters, 956 /// listed in the parameters list. 957 /// Others are initiated to 0. 958 958 /// \param g The digraph the algorithm runs on. 959 BfsWizardBase(const GR &g) : 959 /// \param s The source node. 960 BfsWizardBase(const GR &g, Node s=INVALID) : 960 961 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 961 _reached(0), _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}962 _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {} 962 963 963 964 }; 964 965 965 /// Auxiliary class for the function-type interface of BFS algorithm. 966 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. 966 /// Auxiliary class for the function type interface of BFS algorithm. 967 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. 971 973 /// 972 /// This class should only be used through the \ref bfs() function, 973 /// which makes it easier to use the algorithm. 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. 974 987 template<class TR> 975 988 class BfsWizard : public TR … … 994 1007 ///\brief The type of the map that indicates which nodes are processed. 995 1008 typedef typename TR::ProcessedMap ProcessedMap; 996 ///The type of the shortest paths997 typedef typename TR::Path Path;998 1009 999 1010 public: … … 1006 1017 /// Constructor that requires parameters. 1007 1018 /// These parameters will be the default values for the traits class. 1008 /// \param g The digraph the algorithm runs on. 1009 BfsWizard(const Digraph &g) : 1010 TR(g) {} 1019 BfsWizard(const Digraph &g, Node s=INVALID) : 1020 TR(g,s) {} 1011 1021 1012 1022 ///Copy constructor … … 1015 1025 ~BfsWizard() {} 1016 1026 1017 ///Runs BFS algorithm from the given source node. 1018 1019 ///This method runs BFS algorithm from node \c s 1020 ///in order to compute the shortest path to each node. 1027 ///Runs BFS algorithm from a source node. 1028 1029 ///Runs BFS algorithm from a source node. 1030 ///The node can be given with the \ref source() function. 1031 void run() 1032 { 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. 1021 1050 void run(Node s) 1022 1051 { 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. 1069 void run() 1070 { 1071 run(INVALID); 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; 1072 1064 } 1073 1065 … … 1078 1070 SetPredMapBase(const TR &b) : TR(b) {} 1079 1071 }; 1080 ///\brief \ref named- func-param "Named parameter"1072 ///\brief \ref named-templ-param "Named parameter" 1081 1073 ///for setting \ref PredMap object. 1082 1074 /// 1083 /// \ref named-func-param "Named parameter"1075 /// \ref named-templ-param "Named parameter" 1084 1076 ///for setting \ref PredMap object. 1085 1077 template<class T> … … 1096 1088 SetReachedMapBase(const TR &b) : TR(b) {} 1097 1089 }; 1098 ///\brief \ref named- func-param "Named parameter"1090 ///\brief \ref named-templ-param "Named parameter" 1099 1091 ///for setting \ref ReachedMap object. 1100 1092 /// 1101 /// \ref named- func-param "Named parameter"1093 /// \ref named-templ-param "Named parameter" 1102 1094 ///for setting \ref ReachedMap object. 1103 1095 template<class T> … … 1106 1098 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t)); 1107 1099 return BfsWizard<SetReachedMapBase<T> >(*this); 1100 } 1101 1102 template<class T> 1103 struct SetProcessedMapBase : public Base { 1104 typedef T ProcessedMap; 1105 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; }; 1106 SetProcessedMapBase(const TR &b) : TR(b) {} 1107 }; 1108 ///\brief \ref named-templ-param "Named parameter" 1109 ///for setting \ref ProcessedMap object. 1110 /// 1111 /// \ref named-templ-param "Named parameter" 1112 ///for setting \ref ProcessedMap object. 1113 template<class T> 1114 BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t) 1115 { 1116 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t)); 1117 return BfsWizard<SetProcessedMapBase<T> >(*this); 1108 1118 } 1109 1119 … … 1114 1124 SetDistMapBase(const TR &b) : TR(b) {} 1115 1125 }; 1116 ///\brief \ref named- func-param "Named parameter"1126 ///\brief \ref named-templ-param "Named parameter" 1117 1127 ///for setting \ref DistMap object. 1118 1128 /// 1119 /// \ref named- func-param "Named parameter"1129 /// \ref named-templ-param "Named parameter" 1120 1130 ///for setting \ref DistMap object. 1121 1131 template<class T> … … 1126 1136 } 1127 1137 1128 template<class T>1129 struct SetProcessedMapBase : public Base {1130 typedef T ProcessedMap;1131 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };1132 SetProcessedMapBase(const TR &b) : TR(b) {}1133 };1134 ///\brief \ref named-func-param "Named parameter"1135 ///for setting \ref ProcessedMap object.1136 ///1137 /// \ref named-func-param "Named parameter"1138 ///for setting \ref ProcessedMap object.1139 template<class T>1140 BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)1141 {1142 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));1143 return BfsWizard<SetProcessedMapBase<T> >(*this);1144 }1145 1146 template<class T>1147 struct SetPathBase : public Base {1148 typedef T Path;1149 SetPathBase(const TR &b) : TR(b) {}1150 };1151 ///\brief \ref named-func-param "Named parameter"1152 ///for getting the shortest path to the target node.1153 ///1154 ///\ref named-func-param "Named parameter"1155 ///for getting the shortest path to the target node.1156 template<class T>1157 BfsWizard<SetPathBase<T> > path(const T &t)1158 {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;1172 }1173 1174 1138 }; 1175 1139 1176 ///Function -type interface for BFSalgorithm.1140 ///Function type interface for Bfs algorithm. 1177 1141 1178 1142 /// \ingroup search 1179 ///Function -type interface for BFSalgorithm.1143 ///Function type interface for Bfs algorithm. 1180 1144 /// 1181 ///This function also has several \ref named-func-param "named parameters", 1145 ///This function also has several 1146 ///\ref named-templ-func-param "named parameters", 1182 1147 ///they are declared as the members of class \ref BfsWizard. 1183 ///The following examples show how to use these parameters. 1148 ///The following 1149 ///example shows how to use these parameters. 1184 1150 ///\code 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); 1151 /// bfs(g,source).predMap(preds).run(); 1190 1152 ///\endcode 1191 1153 ///\warning Don't forget to put the \ref BfsWizard::run() "run()" … … 1195 1157 template<class GR> 1196 1158 BfsWizard<BfsWizardBase<GR> > 1197 bfs(const GR & digraph)1159 bfs(const GR &g,typename GR::Node s=INVALID) 1198 1160 { 1199 return BfsWizard<BfsWizardBase<GR> >( digraph);1161 return BfsWizard<BfsWizardBase<GR> >(g,s); 1200 1162 } 1201 1163 -
lemon/concepts/path.h
r278 r236 67 67 /// \brief Template assigment 68 68 template <typename CPath> 69 Path& operator=(const CPath& cpath) { 70 ignore_unused_variable_warning(cpath); 71 return *this; 72 } 69 Path& operator=(const CPath& cpath) {} 73 70 74 71 /// Length of the path ie. the number of arcs in the path. -
lemon/dfs.h
r278 r258 30 30 #include <lemon/assert.h> 31 31 #include <lemon/maps.h> 32 #include <lemon/path.h>33 32 34 33 namespace lemon { … … 118 117 ///This class provides an efficient implementation of the %DFS algorithm. 119 118 /// 120 ///There is also a \ref dfs() "function -type interface" for the DFS119 ///There is also a \ref dfs() "function type interface" for the DFS 121 120 ///algorithm, which is convenient in the simplier cases and it can be 122 121 ///used easier. … … 777 776 ///arcs of the %DFS paths. 778 777 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 779 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 778 /// 779 typedef NullMap<typename Digraph::Node,typename Digraph::Arc> PredMap; 780 780 ///Instantiates a \ref PredMap. 781 781 … … 784 784 ///\ref PredMap. 785 785 ///\todo The digraph alone may be insufficient to initialize 786 #ifdef DOXYGEN 786 787 static PredMap *createPredMap(const Digraph &g) 787 { 788 return new PredMap(g); 788 #else 789 static PredMap *createPredMap(const Digraph &) 790 #endif 791 { 792 return new PredMap(); 789 793 } 790 794 … … 793 797 ///The type of the map that indicates which nodes are processed. 794 798 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 795 ///By default it is a NullMap.796 799 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 797 800 ///Instantiates a \ref ProcessedMap. … … 828 831 ///The type of the map that stores the distances of the nodes. 829 832 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 830 typedef typename Digraph::template NodeMap<int> DistMap; 833 /// 834 typedef NullMap<typename Digraph::Node,int> DistMap; 831 835 ///Instantiates a \ref DistMap. 832 836 … … 834 838 ///\param g is the digraph, to which we would like to define 835 839 ///the \ref DistMap 840 #ifdef DOXYGEN 836 841 static DistMap *createDistMap(const Digraph &g) 837 { 838 return new DistMap(g); 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; 842 #else 843 static DistMap *createDistMap(const Digraph &) 844 #endif 845 { 846 return new DistMap(); 847 } 846 848 }; 847 849 … … 873 875 //Pointer to the map of distances. 874 876 void *_dist; 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; 877 //Pointer to the source node. 878 Node _source; 879 879 880 880 public: … … 882 882 883 883 /// This constructor does not require parameters, therefore it initiates 884 /// all of the attributes to \c 0.884 /// all of the attributes to default values (0, INVALID). 885 885 DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), 886 _dist(0), _ path(0), _di(0) {}886 _dist(0), _source(INVALID) {} 887 887 888 888 /// Constructor. 889 889 890 /// This constructor requires one parameter, 891 /// others are initiated to \c 0. 890 /// This constructor requires some parameters, 891 /// listed in the parameters list. 892 /// Others are initiated to 0. 892 893 /// \param g The digraph the algorithm runs on. 893 DfsWizardBase(const GR &g) : 894 /// \param s The source node. 895 DfsWizardBase(const GR &g, Node s=INVALID) : 894 896 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 895 _reached(0), _processed(0), _pred(0), _dist(0), _path(0), _di(0) {}897 _reached(0), _processed(0), _pred(0), _dist(0), _source(s) {} 896 898 897 899 }; 898 900 899 /// Auxiliary class for the function-type interface of DFS algorithm. 900 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. 901 /// Auxiliary class for the function type interface of DFS algorithm. 902 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. 905 908 /// 906 /// This class should only be used through the \ref dfs() function, 907 /// which makes it easier to use the algorithm. 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. 908 922 template<class TR> 909 923 class DfsWizard : public TR … … 920 934 921 935 ///\brief The type of the map that stores the predecessor 922 ///arcs of the DFSpaths.936 ///arcs of the shortest paths. 923 937 typedef typename TR::PredMap PredMap; 924 938 ///\brief The type of the map that stores the distances of the nodes. … … 928 942 ///\brief The type of the map that indicates which nodes are processed. 929 943 typedef typename TR::ProcessedMap ProcessedMap; 930 ///The type of the DFS paths931 typedef typename TR::Path Path;932 944 933 945 public: … … 940 952 /// Constructor that requires parameters. 941 953 /// These parameters will be the default values for the traits class. 942 /// \param g The digraph the algorithm runs on. 943 DfsWizard(const Digraph &g) : 944 TR(g) {} 954 DfsWizard(const Digraph &g, Node s=INVALID) : 955 TR(g,s) {} 945 956 946 957 ///Copy constructor … … 949 960 ~DfsWizard() {} 950 961 951 ///Runs DFS algorithm from the given source node. 952 953 ///This method runs DFS algorithm from node \c s 954 ///in order to compute the DFS path to each node. 962 ///Runs DFS algorithm from a source node. 963 964 ///Runs DFS algorithm from a source node. 965 ///The node can be given with the \ref source() function. 966 void run() 967 { 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. 955 985 void run(Node s) 956 986 { 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. 1003 void run() 1004 { 1005 run(INVALID); 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; 1006 999 } 1007 1000 … … 1012 1005 SetPredMapBase(const TR &b) : TR(b) {} 1013 1006 }; 1014 ///\brief \ref named- func-param "Named parameter"1007 ///\brief \ref named-templ-param "Named parameter" 1015 1008 ///for setting \ref PredMap object. 1016 1009 /// 1017 ///\ref named- func-param "Named parameter"1010 ///\ref named-templ-param "Named parameter" 1018 1011 ///for setting \ref PredMap object. 1019 1012 template<class T> … … 1030 1023 SetReachedMapBase(const TR &b) : TR(b) {} 1031 1024 }; 1032 ///\brief \ref named- func-param "Named parameter"1025 ///\brief \ref named-templ-param "Named parameter" 1033 1026 ///for setting \ref ReachedMap object. 1034 1027 /// 1035 /// \ref named- func-param "Named parameter"1028 /// \ref named-templ-param "Named parameter" 1036 1029 ///for setting \ref ReachedMap object. 1037 1030 template<class T> … … 1040 1033 Base::_reached=reinterpret_cast<void*>(const_cast<T*>(&t)); 1041 1034 return DfsWizard<SetReachedMapBase<T> >(*this); 1035 } 1036 1037 template<class T> 1038 struct SetProcessedMapBase : public Base { 1039 typedef T ProcessedMap; 1040 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; }; 1041 SetProcessedMapBase(const TR &b) : TR(b) {} 1042 }; 1043 ///\brief \ref named-templ-param "Named parameter" 1044 ///for setting \ref ProcessedMap object. 1045 /// 1046 /// \ref named-templ-param "Named parameter" 1047 ///for setting \ref ProcessedMap object. 1048 template<class T> 1049 DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t) 1050 { 1051 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t)); 1052 return DfsWizard<SetProcessedMapBase<T> >(*this); 1042 1053 } 1043 1054 … … 1048 1059 SetDistMapBase(const TR &b) : TR(b) {} 1049 1060 }; 1050 ///\brief \ref named- func-param "Named parameter"1061 ///\brief \ref named-templ-param "Named parameter" 1051 1062 ///for setting \ref DistMap object. 1052 1063 /// 1053 /// \ref named-func-param "Named parameter"1064 ///\ref named-templ-param "Named parameter" 1054 1065 ///for setting \ref DistMap object. 1055 1066 template<class T> … … 1060 1071 } 1061 1072 1062 template<class T>1063 struct SetProcessedMapBase : public Base {1064 typedef T ProcessedMap;1065 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };1066 SetProcessedMapBase(const TR &b) : TR(b) {}1067 };1068 ///\brief \ref named-func-param "Named parameter"1069 ///for setting \ref ProcessedMap object.1070 ///1071 /// \ref named-func-param "Named parameter"1072 ///for setting \ref ProcessedMap object.1073 template<class T>1074 DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t)1075 {1076 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));1077 return DfsWizard<SetProcessedMapBase<T> >(*this);1078 }1079 1080 template<class T>1081 struct SetPathBase : public Base {1082 typedef T Path;1083 SetPathBase(const TR &b) : TR(b) {}1084 };1085 ///\brief \ref named-func-param "Named parameter"1086 ///for getting the DFS path to the target node.1087 ///1088 ///\ref named-func-param "Named parameter"1089 ///for getting the DFS path to the target node.1090 template<class T>1091 DfsWizard<SetPathBase<T> > path(const T &t)1092 {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;1106 }1107 1108 1073 }; 1109 1074 1110 ///Function -type interface for DFSalgorithm.1075 ///Function type interface for Dfs algorithm. 1111 1076 1112 1077 ///\ingroup search 1113 ///Function -type interface for DFSalgorithm.1078 ///Function type interface for Dfs algorithm. 1114 1079 /// 1115 ///This function also has several \ref named-func-param "named parameters", 1080 ///This function also has several 1081 ///\ref named-templ-func-param "named parameters", 1116 1082 ///they are declared as the members of class \ref DfsWizard. 1117 ///The following examples show how to use these parameters. 1083 ///The following 1084 ///example shows how to use these parameters. 1118 1085 ///\code 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); 1086 /// dfs(g,source).predMap(preds).run(); 1124 1087 ///\endcode 1125 1126 1088 ///\warning Don't forget to put the \ref DfsWizard::run() "run()" 1127 1089 ///to the end of the parameter list. … … 1130 1092 template<class GR> 1131 1093 DfsWizard<DfsWizardBase<GR> > 1132 dfs(const GR & digraph)1094 dfs(const GR &g,typename GR::Node s=INVALID) 1133 1095 { 1134 return DfsWizard<DfsWizardBase<GR> >( digraph);1096 return DfsWizard<DfsWizardBase<GR> >(g,s); 1135 1097 } 1136 1098 -
lemon/dijkstra.h
r278 r258 31 31 #include <lemon/error.h> 32 32 #include <lemon/maps.h> 33 #include <lemon/path.h>34 33 35 34 namespace lemon { … … 201 200 ///It is also possible to change the underlying priority heap. 202 201 /// 203 ///There is also a \ref dijkstra() "function -type interface" for the202 ///There is also a \ref dijkstra() "function type interface" for the 204 203 ///%Dijkstra algorithm, which is convenient in the simplier cases and 205 204 ///it can be used easier. … … 989 988 ///arcs of the shortest paths. 990 989 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 991 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap;990 typedef NullMap <typename Digraph::Node,typename Digraph::Arc> PredMap; 992 991 ///Instantiates a \ref PredMap. 993 992 … … 996 995 ///\ref PredMap. 997 996 ///\todo The digraph alone may be insufficient to initialize 997 #ifdef DOXYGEN 998 998 static PredMap *createPredMap(const Digraph &g) 999 { 1000 return new PredMap(g); 999 #else 1000 static PredMap *createPredMap(const Digraph &) 1001 #endif 1002 { 1003 return new PredMap(); 1001 1004 } 1002 1005 … … 1028 1031 ///The type of the map that stores the distances of the nodes. 1029 1032 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 1030 typedef typename Digraph::template NodeMap<typename LM::Value> DistMap;1033 typedef NullMap<typename Digraph::Node,Value> DistMap; 1031 1034 ///Instantiates a \ref DistMap. 1032 1035 … … 1034 1037 ///\param g is the digraph, to which we would like to define 1035 1038 ///the \ref DistMap 1039 #ifdef DOXYGEN 1036 1040 static DistMap *createDistMap(const Digraph &g) 1037 { 1038 return new DistMap(g); 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; 1041 #else 1042 static DistMap *createDistMap(const Digraph &) 1043 #endif 1044 { 1045 return new DistMap(); 1046 } 1046 1047 }; 1047 1048 … … 1065 1066 //Pointer to the digraph the algorithm runs on. 1066 1067 void *_g; 1067 //Pointer to the length map .1068 //Pointer to the length map 1068 1069 void *_length; 1069 1070 //Pointer to the map of processed nodes. … … 1073 1074 //Pointer to the map of distances. 1074 1075 void *_dist; 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; 1076 //Pointer to the source node. 1077 Node _source; 1079 1078 1080 1079 public: … … 1082 1081 1083 1082 /// This constructor does not require parameters, therefore it initiates 1084 /// all of the attributes to \c 0.1083 /// all of the attributes to default values (0, INVALID). 1085 1084 DijkstraWizardBase() : _g(0), _length(0), _processed(0), _pred(0), 1086 _dist(0), _ path(0), _di(0) {}1085 _dist(0), _source(INVALID) {} 1087 1086 1088 1087 /// Constructor. 1089 1088 1090 /// This constructor requires two parameters, 1091 /// others are initiated to \c 0. 1089 /// This constructor requires some parameters, 1090 /// listed in the parameters list. 1091 /// Others are initiated to 0. 1092 1092 /// \param g The digraph the algorithm runs on. 1093 1093 /// \param l The length map. 1094 DijkstraWizardBase(const GR &g,const LM &l) : 1094 /// \param s The source node. 1095 DijkstraWizardBase(const GR &g,const LM &l, Node s=INVALID) : 1095 1096 _g(reinterpret_cast<void*>(const_cast<GR*>(&g))), 1096 1097 _length(reinterpret_cast<void*>(const_cast<LM*>(&l))), 1097 _processed(0), _pred(0), _dist(0), _ path(0), _di(0) {}1098 _processed(0), _pred(0), _dist(0), _source(s) {} 1098 1099 1099 1100 }; 1100 1101 1101 /// Auxiliary class for the function-type interface of Dijkstra algorithm. 1102 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. 1102 /// Auxiliary class for the function type interface of Dijkstra algorithm. 1103 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. 1107 1109 /// 1108 /// This class should only be used through the \ref dijkstra() function, 1109 /// which makes it easier to use the algorithm. 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. 1110 1123 template<class TR> 1111 1124 class DijkstraWizard : public TR … … 1132 1145 ///The type of the map that indicates which nodes are processed. 1133 1146 typedef typename TR::ProcessedMap ProcessedMap; 1134 ///The type of the shortest paths1135 typedef typename TR::Path Path;1136 1147 ///The heap type used by the dijkstra algorithm. 1137 1148 typedef typename TR::Heap Heap; … … 1146 1157 /// Constructor that requires parameters. 1147 1158 /// These parameters will be the default values for the traits class. 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) {} 1159 DijkstraWizard(const Digraph &g,const LengthMap &l, Node s=INVALID) : 1160 TR(g,l,s) {} 1152 1161 1153 1162 ///Copy constructor … … 1156 1165 ~DijkstraWizard() {} 1157 1166 1158 ///Runs Dijkstra algorithm from the given source node. 1159 1160 ///This method runs %Dijkstra algorithm from the given source node 1161 ///in order to compute the shortest path to each node. 1167 ///Runs Dijkstra algorithm from a source node. 1168 1169 ///Runs Dijkstra algorithm from a source node. 1170 ///The node can be given with the \ref source() function. 1171 void run() 1172 { 1173 if(Base::_source==INVALID) throw UninitializedParameter(); 1174 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); 1184 } 1185 1186 ///Runs Dijkstra algorithm from the given node. 1187 1188 ///Runs Dijkstra algorithm from the given node. 1189 ///\param s is the given source. 1162 1190 void run(Node s) 1163 1191 { 1164 if (s==INVALID) throw UninitializedParameter(); 1165 Dijkstra<Digraph,LengthMap,TR> 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); 1175 } 1176 1177 ///Finds the shortest path between \c s and \c t. 1178 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) 1185 { 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); 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; 1202 1204 } 1203 1205 … … 1208 1210 SetPredMapBase(const TR &b) : TR(b) {} 1209 1211 }; 1210 ///\brief \ref named- func-param "Named parameter"1212 ///\brief \ref named-templ-param "Named parameter" 1211 1213 ///for setting \ref PredMap object. 1212 1214 /// 1213 ///\ref named- func-param "Named parameter"1215 ///\ref named-templ-param "Named parameter" 1214 1216 ///for setting \ref PredMap object. 1215 1217 template<class T> … … 1218 1220 Base::_pred=reinterpret_cast<void*>(const_cast<T*>(&t)); 1219 1221 return DijkstraWizard<SetPredMapBase<T> >(*this); 1222 } 1223 1224 template<class T> 1225 struct SetProcessedMapBase : public Base { 1226 typedef T ProcessedMap; 1227 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; }; 1228 SetProcessedMapBase(const TR &b) : TR(b) {} 1229 }; 1230 ///\brief \ref named-templ-param "Named parameter" 1231 ///for setting \ref ProcessedMap object. 1232 /// 1233 /// \ref named-templ-param "Named parameter" 1234 ///for setting \ref ProcessedMap object. 1235 template<class T> 1236 DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t) 1237 { 1238 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t)); 1239 return DijkstraWizard<SetProcessedMapBase<T> >(*this); 1220 1240 } 1221 1241 … … 1226 1246 SetDistMapBase(const TR &b) : TR(b) {} 1227 1247 }; 1228 ///\brief \ref named- func-param "Named parameter"1248 ///\brief \ref named-templ-param "Named parameter" 1229 1249 ///for setting \ref DistMap object. 1230 1250 /// 1231 ///\ref named- func-param "Named parameter"1251 ///\ref named-templ-param "Named parameter" 1232 1252 ///for setting \ref DistMap object. 1233 1253 template<class T> … … 1238 1258 } 1239 1259 1240 template<class T>1241 struct SetProcessedMapBase : public Base {1242 typedef T ProcessedMap;1243 static ProcessedMap *createProcessedMap(const Digraph &) { return 0; };1244 SetProcessedMapBase(const TR &b) : TR(b) {}1245 };1246 ///\brief \ref named-func-param "Named parameter"1247 ///for setting \ref ProcessedMap object.1248 ///1249 /// \ref named-func-param "Named parameter"1250 ///for setting \ref ProcessedMap object.1251 template<class T>1252 DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t)1253 {1254 Base::_processed=reinterpret_cast<void*>(const_cast<T*>(&t));1255 return DijkstraWizard<SetProcessedMapBase<T> >(*this);1256 }1257 1258 template<class T>1259 struct SetPathBase : public Base {1260 typedef T Path;1261 SetPathBase(const TR &b) : TR(b) {}1262 };1263 ///\brief \ref named-func-param "Named parameter"1264 ///for getting the shortest path to the target node.1265 ///1266 ///\ref named-func-param "Named parameter"1267 ///for getting the shortest path to the target node.1268 template<class T>1269 DijkstraWizard<SetPathBase<T> > path(const T &t)1270 {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;1284 }1285 1286 1260 }; 1287 1261 1288 ///Function -type interface for Dijkstra algorithm.1262 ///Function type interface for Dijkstra algorithm. 1289 1263 1290 1264 /// \ingroup shortest_path 1291 ///Function -type interface for Dijkstra algorithm.1265 ///Function type interface for Dijkstra algorithm. 1292 1266 /// 1293 ///This function also has several \ref named-func-param "named parameters", 1267 ///This function also has several 1268 ///\ref named-templ-func-param "named parameters", 1294 1269 ///they are declared as the members of class \ref DijkstraWizard. 1295 ///The following examples show how to use these parameters. 1270 ///The following 1271 ///example shows how to use these parameters. 1296 1272 ///\code 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); 1273 /// dijkstra(g,length,source).predMap(preds).run(); 1302 1274 ///\endcode 1303 1275 ///\warning Don't forget to put the \ref DijkstraWizard::run() "run()" … … 1307 1279 template<class GR, class LM> 1308 1280 DijkstraWizard<DijkstraWizardBase<GR,LM> > 1309 dijkstra(const GR & digraph, const LM &length)1281 dijkstra(const GR &g,const LM &l,typename GR::Node s=INVALID) 1310 1282 { 1311 return DijkstraWizard<DijkstraWizardBase<GR,LM> >( digraph,length);1283 return DijkstraWizard<DijkstraWizardBase<GR,LM> >(g,l,s); 1312 1284 } 1313 1285 -
test/bfs_test.cc
r278 r228 63 63 BType::DistMap d(G); 64 64 BType::PredMap p(G); 65 // BType::PredNodeMap pn(G); 65 66 66 67 BType bfs_test(G); … … 72 73 n = bfs_test.predNode(n); 73 74 d = bfs_test.distMap(); 75 74 76 p = bfs_test.predMap(); 77 // pn = bfs_test.predNodeMap(); 75 78 b = bfs_test.reached(n); 76 79 … … 86 89 87 90 Digraph g; 88 bool b; 89 bfs(g).run(Node()); 90 b=bfs(g).run(Node(),Node()); 91 bfs(g).run(); 91 bfs(g,Node()).run(); 92 bfs(g).source(Node()).run(); 92 93 bfs(g) 93 .predMap(concepts:: ReadWriteMap<Node,Arc>())94 .distMap(concepts:: ReadWriteMap<Node,VType>())94 .predMap(concepts::WriteMap<Node,Arc>()) 95 .distMap(concepts::WriteMap<Node,VType>()) 95 96 .reachedMap(concepts::ReadWriteMap<Node,bool>()) 96 97 .processedMap(concepts::WriteMap<Node,bool>()) 97 98 .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();112 99 } 113 100 … … 128 115 bfs_test.run(s); 129 116 130 check(bfs_test.dist(t)==2,"Bfs found a wrong path." );117 check(bfs_test.dist(t)==2,"Bfs found a wrong path." << bfs_test.dist(t)); 131 118 132 119 Path<Digraph> p = bfs_test.path(t); … … 142 129 check( !bfs_test.reached(u) || 143 130 (bfs_test.dist(v) <= bfs_test.dist(u)+1), 144 "Wrong output. " << G.id(u) << "->" << G.id(v));131 "Wrong output." << G.id(v) << ' ' << G.id(u)); 145 132 } 146 133 … … 154 141 check(bfs_test.dist(v) - bfs_test.dist(u) == 1, 155 142 "Wrong distance. Difference: " 156 << std::abs(bfs_test.dist(v) - bfs_test.dist(u) - 1)); 143 << std::abs(bfs_test.dist(v) - bfs_test.dist(u) 144 - 1)); 157 145 } 158 146 } 159 }160 161 {162 NullMap<Node,Arc> myPredMap;163 bfs(G).predMap(myPredMap).run(s);164 147 } 165 148 } -
test/dfs_test.cc
r278 r228 21 21 #include <lemon/list_graph.h> 22 22 #include <lemon/lgf_reader.h> 23 23 24 #include <lemon/dfs.h> 24 25 #include <lemon/path.h> … … 88 89 89 90 Digraph g; 90 bool b; 91 dfs(g).run(Node()); 92 b=dfs(g).run(Node(),Node()); 93 dfs(g).run(); 91 dfs(g,Node()).run(); 92 dfs(g).source(Node()).run(); 94 93 dfs(g) 95 .predMap(concepts:: ReadWriteMap<Node,Arc>())96 .distMap(concepts:: ReadWriteMap<Node,VType>())94 .predMap(concepts::WriteMap<Node,Arc>()) 95 .distMap(concepts::WriteMap<Node,VType>()) 97 96 .reachedMap(concepts::ReadWriteMap<Node,bool>()) 98 97 .processedMap(concepts::WriteMap<Node,bool>()) 99 98 .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();114 99 } 115 100 … … 145 130 check(dfs_test.dist(v) - dfs_test.dist(u) == 1, 146 131 "Wrong distance. (" << dfs_test.dist(u) << "->" 147 << dfs_test.dist(v) << ")");132 <<dfs_test.dist(v) << ')'); 148 133 } 149 134 } 150 }151 152 {153 NullMap<Node,Arc> myPredMap;154 dfs(G).predMap(myPredMap).run(s);155 135 } 156 136 } -
test/dijkstra_test.cc
r278 r228 21 21 #include <lemon/list_graph.h> 22 22 #include <lemon/lgf_reader.h> 23 23 24 #include <lemon/dijkstra.h> 24 25 #include <lemon/path.h> … … 64 65 DType::DistMap d(G); 65 66 DType::PredMap p(G); 67 // DType::PredNodeMap pn(G); 66 68 LengthMap length; 67 69 … … 75 77 d = dijkstra_test.distMap(); 76 78 p = dijkstra_test.predMap(); 79 // pn = dijkstra_test.predNodeMap(); 77 80 b = dijkstra_test.reached(n); 78 81 … … 89 92 90 93 Digraph g; 91 bool b; 92 dijkstra(g,LengthMap()).run(Node()); 93 b=dijkstra(g,LengthMap()).run(Node(),Node()); 94 dijkstra(g,LengthMap(),Node()).run(); 95 dijkstra(g,LengthMap()).source(Node()).run(); 94 96 dijkstra(g,LengthMap()) 95 .predMap(concepts::ReadWriteMap<Node,Arc>()) 96 .distMap(concepts::ReadWriteMap<Node,VType>()) 97 .processedMap(concepts::WriteMap<Node,bool>()) 97 .predMap(concepts::WriteMap<Node,Arc>()) 98 .distMap(concepts::WriteMap<Node,VType>()) 98 99 .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());106 100 } 107 101 … … 129 123 130 124 Path<Digraph> p = dijkstra_test.path(t); 131 check(p.length()==3," path() found a wrong path.");125 check(p.length()==3,"getPath() found a wrong path."); 132 126 check(checkPath(G, p),"path() found a wrong path."); 133 127 check(pathSource(G, p) == s,"path() found a wrong path."); … … 139 133 check( !dijkstra_test.reached(u) || 140 134 (dijkstra_test.dist(v) - dijkstra_test.dist(u) <= length[e]), 141 " Wrong output. dist(target)-dist(source)-arc_length=" <<135 "dist(target)-dist(source)-arc_length= " << 142 136 dijkstra_test.dist(v) - dijkstra_test.dist(u) - length[e]); 143 137 }
Note: See TracChangeset
for help on using the changeset viewer.