Changeset 717:684964884a2e in lemon-main
- Timestamp:
- 09/25/09 09:13:03 (15 years ago)
- Branch:
- default
- Parents:
- 716:f47b6c94577e (diff), 715:ece80147fb08 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - Phase:
- public
- Location:
- lemon
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bfs.h
r713 r717 48 48 ///The type of the map that stores the predecessor 49 49 ///arcs of the shortest paths. 50 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.50 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 51 51 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 52 52 ///Instantiates a \c PredMap. … … 63 63 64 64 ///The type of the map that indicates which nodes are processed. 65 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 65 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 66 ///By default it is a NullMap. 66 67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 67 68 ///Instantiates a \c ProcessedMap. … … 82 83 83 84 ///The type of the map that indicates which nodes are reached. 84 ///It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.85 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 85 86 typedef typename Digraph::template NodeMap<bool> ReachedMap; 86 87 ///Instantiates a \c ReachedMap. … … 97 98 98 99 ///The type of the map that stores the distances of the nodes. 99 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.100 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 100 101 typedef typename Digraph::template NodeMap<int> DistMap; 101 102 ///Instantiates a \c DistMap. … … 226 227 ///\ref named-templ-param "Named parameter" for setting 227 228 ///\c PredMap type. 228 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.229 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 229 230 template <class T> 230 231 struct SetPredMap : public Bfs< Digraph, SetPredMapTraits<T> > { … … 246 247 ///\ref named-templ-param "Named parameter" for setting 247 248 ///\c DistMap type. 248 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.249 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 249 250 template <class T> 250 251 struct SetDistMap : public Bfs< Digraph, SetDistMapTraits<T> > { … … 266 267 ///\ref named-templ-param "Named parameter" for setting 267 268 ///\c ReachedMap type. 268 ///It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.269 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 269 270 template <class T> 270 271 struct SetReachedMap : public Bfs< Digraph, SetReachedMapTraits<T> > { … … 286 287 ///\ref named-templ-param "Named parameter" for setting 287 288 ///\c ProcessedMap type. 288 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.289 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 289 290 template <class T> 290 291 struct SetProcessedMap : public Bfs< Digraph, SetProcessedMapTraits<T> > { … … 738 739 ///@{ 739 740 740 ///The shortest path to anode.741 742 ///Returns the shortest path to a node.741 ///The shortest path to the given node. 742 743 ///Returns the shortest path to the given node from the root(s). 743 744 /// 744 745 ///\warning \c t should be reached from the root(s). … … 748 749 Path path(Node t) const { return Path(*G, *_pred, t); } 749 750 750 ///The distance of anode from the root(s).751 752 ///Returns the distance of anode from the root(s).751 ///The distance of the given node from the root(s). 752 753 ///Returns the distance of the given node from the root(s). 753 754 /// 754 755 ///\warning If node \c v is not reached from the root(s), then … … 759 760 int dist(Node v) const { return (*_dist)[v]; } 760 761 761 ///Returns the 'previous arc' of the shortest path tree for a node. 762 762 ///\brief Returns the 'previous arc' of the shortest path tree for 763 ///the given node. 764 /// 763 765 ///This function returns the 'previous arc' of the shortest path 764 766 ///tree for the node \c v, i.e. it returns the last arc of a … … 767 769 /// 768 770 ///The shortest path tree used here is equal to the shortest path 769 ///tree used in \ref predNode() .771 ///tree used in \ref predNode() and \ref predMap(). 770 772 /// 771 773 ///\pre Either \ref run(Node) "run()" or \ref init() … … 773 775 Arc predArc(Node v) const { return (*_pred)[v];} 774 776 775 ///Returns the 'previous node' of the shortest path tree for a node. 776 777 ///\brief Returns the 'previous node' of the shortest path tree for 778 ///the given node. 779 /// 777 780 ///This function returns the 'previous node' of the shortest path 778 781 ///tree for the node \c v, i.e. it returns the last but one node 779 /// froma shortest path from a root to \c v. It is \c INVALID782 ///of a shortest path from a root to \c v. It is \c INVALID 780 783 ///if \c v is not reached from the root(s) or if \c v is a root. 781 784 /// 782 785 ///The shortest path tree used here is equal to the shortest path 783 ///tree used in \ref predArc() .786 ///tree used in \ref predArc() and \ref predMap(). 784 787 /// 785 788 ///\pre Either \ref run(Node) "run()" or \ref init() … … 802 805 /// 803 806 ///Returns a const reference to the node map that stores the predecessor 804 ///arcs, which form the shortest path tree .807 ///arcs, which form the shortest path tree (forest). 805 808 /// 806 809 ///\pre Either \ref run(Node) "run()" or \ref init() … … 808 811 const PredMap &predMap() const { return *_pred;} 809 812 810 ///Checks if anode is reached from the root(s).813 ///Checks if the given node is reached from the root(s). 811 814 812 815 ///Returns \c true if \c v is reached from the root(s). … … 834 837 ///The type of the map that stores the predecessor 835 838 ///arcs of the shortest paths. 836 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.839 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 837 840 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 838 841 ///Instantiates a PredMap. … … 849 852 850 853 ///The type of the map that indicates which nodes are processed. 851 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.854 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 852 855 ///By default it is a NullMap. 853 856 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; … … 869 872 870 873 ///The type of the map that indicates which nodes are reached. 871 ///It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.874 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 872 875 typedef typename Digraph::template NodeMap<bool> ReachedMap; 873 876 ///Instantiates a ReachedMap. … … 884 887 885 888 ///The type of the map that stores the distances of the nodes. 886 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.889 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 887 890 typedef typename Digraph::template NodeMap<int> DistMap; 888 891 ///Instantiates a DistMap. … … 899 902 900 903 ///The type of the shortest paths. 901 ///It must meetthe \ref concepts::Path "Path" concept.904 ///It must conform to the \ref concepts::Path "Path" concept. 902 905 typedef lemon::Path<Digraph> Path; 903 906 }; … … 905 908 /// Default traits class used by BfsWizard 906 909 907 /// To make it easier to use Bfs algorithm 908 /// we have created a wizard class. 909 /// This \ref BfsWizard class needs default traits, 910 /// as well as the \ref Bfs class. 911 /// The \ref BfsWizardBase is a class to be the default traits of the 912 /// \ref BfsWizard class. 910 /// Default traits class used by BfsWizard. 911 /// \tparam GR The type of the digraph. 913 912 template<class GR> 914 913 class BfsWizardBase : public BfsWizardDefaultTraits<GR> … … 938 937 /// Constructor. 939 938 940 /// This constructor does not require parameters, thereforeit initiates939 /// This constructor does not require parameters, it initiates 941 940 /// all of the attributes to \c 0. 942 941 BfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), … … 968 967 typedef TR Base; 969 968 970 ///The type of the digraph the algorithm runs on.971 969 typedef typename TR::Digraph Digraph; 972 970 … … 976 974 typedef typename Digraph::OutArcIt OutArcIt; 977 975 978 ///\brief The type of the map that stores the predecessor979 ///arcs of the shortest paths.980 976 typedef typename TR::PredMap PredMap; 981 ///\brief The type of the map that stores the distances of the nodes.982 977 typedef typename TR::DistMap DistMap; 983 ///\brief The type of the map that indicates which nodes are reached.984 978 typedef typename TR::ReachedMap ReachedMap; 985 ///\brief The type of the map that indicates which nodes are processed.986 979 typedef typename TR::ProcessedMap ProcessedMap; 987 ///The type of the shortest paths988 980 typedef typename TR::Path Path; 989 981 … … 1068 1060 SetPredMapBase(const TR &b) : TR(b) {} 1069 1061 }; 1070 ///\brief \ref named-func-param "Named parameter" 1071 ///for setting PredMap object. 1072 /// 1073 ///\ref named-func-param "Named parameter" 1074 ///for setting PredMap object. 1062 1063 ///\brief \ref named-templ-param "Named parameter" for setting 1064 ///the predecessor map. 1065 /// 1066 ///\ref named-templ-param "Named parameter" function for setting 1067 ///the map that stores the predecessor arcs of the nodes. 1075 1068 template<class T> 1076 1069 BfsWizard<SetPredMapBase<T> > predMap(const T &t) … … 1086 1079 SetReachedMapBase(const TR &b) : TR(b) {} 1087 1080 }; 1088 ///\brief \ref named-func-param "Named parameter" 1089 ///for setting ReachedMap object. 1090 /// 1091 /// \ref named-func-param "Named parameter" 1092 ///for setting ReachedMap object. 1081 1082 ///\brief \ref named-templ-param "Named parameter" for setting 1083 ///the reached map. 1084 /// 1085 ///\ref named-templ-param "Named parameter" function for setting 1086 ///the map that indicates which nodes are reached. 1093 1087 template<class T> 1094 1088 BfsWizard<SetReachedMapBase<T> > reachedMap(const T &t) … … 1104 1098 SetDistMapBase(const TR &b) : TR(b) {} 1105 1099 }; 1106 ///\brief \ref named-func-param "Named parameter" 1107 ///for setting DistMap object. 1108 /// 1109 /// \ref named-func-param "Named parameter" 1110 ///for setting DistMap object. 1100 1101 ///\brief \ref named-templ-param "Named parameter" for setting 1102 ///the distance map. 1103 /// 1104 ///\ref named-templ-param "Named parameter" function for setting 1105 ///the map that stores the distances of the nodes calculated 1106 ///by the algorithm. 1111 1107 template<class T> 1112 1108 BfsWizard<SetDistMapBase<T> > distMap(const T &t) … … 1122 1118 SetProcessedMapBase(const TR &b) : TR(b) {} 1123 1119 }; 1124 ///\brief \ref named-func-param "Named parameter" 1125 ///for setting ProcessedMap object. 1126 /// 1127 /// \ref named-func-param "Named parameter" 1128 ///for setting ProcessedMap object. 1120 1121 ///\brief \ref named-func-param "Named parameter" for setting 1122 ///the processed map. 1123 /// 1124 ///\ref named-templ-param "Named parameter" function for setting 1125 ///the map that indicates which nodes are processed. 1129 1126 template<class T> 1130 1127 BfsWizard<SetProcessedMapBase<T> > processedMap(const T &t) … … 1265 1262 /// 1266 1263 /// The type of the map that indicates which nodes are reached. 1267 /// It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.1264 /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 1268 1265 typedef typename Digraph::template NodeMap<bool> ReachedMap; 1269 1266 … … 1736 1733 ///@{ 1737 1734 1738 /// \brief Checks if anode is reached from the root(s).1735 /// \brief Checks if the given node is reached from the root(s). 1739 1736 /// 1740 1737 /// Returns \c true if \c v is reached from the root(s). -
lemon/bfs.h
r716 r717 415 415 ///The simplest way to execute the BFS algorithm is to use one of the 416 416 ///member functions called \ref run(Node) "run()".\n 417 ///If you need more control on the execution, firstyou have to call418 ///\ref init() , then you can add several source nodes with417 ///If you need better control on the execution, you have to call 418 ///\ref init() first, then you can add several source nodes with 419 419 ///\ref addSource(). Finally the actual path computation can be 420 420 ///performed with one of the \ref start() functions. … … 1423 1423 /// The simplest way to execute the BFS algorithm is to use one of the 1424 1424 /// member functions called \ref run(Node) "run()".\n 1425 /// If you need more control on the execution, firstyou have to call1426 /// \ref init() , then you can add several source nodes with1425 /// If you need better control on the execution, you have to call 1426 /// \ref init() first, then you can add several source nodes with 1427 1427 /// \ref addSource(). Finally the actual path computation can be 1428 1428 /// performed with one of the \ref start() functions. -
lemon/dfs.h
r713 r717 48 48 ///The type of the map that stores the predecessor 49 49 ///arcs of the %DFS paths. 50 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.50 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 51 51 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 52 52 ///Instantiates a \c PredMap. … … 63 63 64 64 ///The type of the map that indicates which nodes are processed. 65 ///It must meet the \ref concepts::WriteMap "WriteMap" concept. 65 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 66 ///By default it is a NullMap. 66 67 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; 67 68 ///Instantiates a \c ProcessedMap. … … 82 83 83 84 ///The type of the map that indicates which nodes are reached. 84 ///It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.85 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 85 86 typedef typename Digraph::template NodeMap<bool> ReachedMap; 86 87 ///Instantiates a \c ReachedMap. … … 97 98 98 99 ///The type of the map that stores the distances of the nodes. 99 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.100 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 100 101 typedef typename Digraph::template NodeMap<int> DistMap; 101 102 ///Instantiates a \c DistMap. … … 225 226 ///\ref named-templ-param "Named parameter" for setting 226 227 ///\c PredMap type. 227 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.228 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 228 229 template <class T> 229 230 struct SetPredMap : public Dfs<Digraph, SetPredMapTraits<T> > { … … 245 246 ///\ref named-templ-param "Named parameter" for setting 246 247 ///\c DistMap type. 247 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.248 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 248 249 template <class T> 249 250 struct SetDistMap : public Dfs< Digraph, SetDistMapTraits<T> > { … … 265 266 ///\ref named-templ-param "Named parameter" for setting 266 267 ///\c ReachedMap type. 267 ///It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.268 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 268 269 template <class T> 269 270 struct SetReachedMap : public Dfs< Digraph, SetReachedMapTraits<T> > { … … 285 286 ///\ref named-templ-param "Named parameter" for setting 286 287 ///\c ProcessedMap type. 287 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.288 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 288 289 template <class T> 289 290 struct SetProcessedMap : public Dfs< Digraph, SetProcessedMapTraits<T> > { … … 670 671 ///@{ 671 672 672 ///The DFS path to anode.673 674 ///Returns the DFS path to a node.673 ///The DFS path to the given node. 674 675 ///Returns the DFS path to the given node from the root(s). 675 676 /// 676 677 ///\warning \c t should be reached from the root(s). … … 680 681 Path path(Node t) const { return Path(*G, *_pred, t); } 681 682 682 ///The distance of anode from the root(s).683 684 ///Returns the distance of anode from the root(s).683 ///The distance of the given node from the root(s). 684 685 ///Returns the distance of the given node from the root(s). 685 686 /// 686 687 ///\warning If node \c v is not reached from the root(s), then … … 691 692 int dist(Node v) const { return (*_dist)[v]; } 692 693 693 ///Returns the 'previous arc' of the %DFS tree for anode.694 ///Returns the 'previous arc' of the %DFS tree for the given node. 694 695 695 696 ///This function returns the 'previous arc' of the %DFS tree for the … … 699 700 /// 700 701 ///The %DFS tree used here is equal to the %DFS tree used in 701 ///\ref predNode() .702 ///\ref predNode() and \ref predMap(). 702 703 /// 703 704 ///\pre Either \ref run(Node) "run()" or \ref init() … … 705 706 Arc predArc(Node v) const { return (*_pred)[v];} 706 707 707 ///Returns the 'previous node' of the %DFS tree .708 ///Returns the 'previous node' of the %DFS tree for the given node. 708 709 709 710 ///This function returns the 'previous node' of the %DFS 710 711 ///tree for the node \c v, i.e. it returns the last but one node 711 /// froma %DFS path from a root to \c v. It is \c INVALID712 ///of a %DFS path from a root to \c v. It is \c INVALID 712 713 ///if \c v is not reached from the root(s) or if \c v is a root. 713 714 /// 714 715 ///The %DFS tree used here is equal to the %DFS tree used in 715 ///\ref predArc() .716 ///\ref predArc() and \ref predMap(). 716 717 /// 717 718 ///\pre Either \ref run(Node) "run()" or \ref init() … … 734 735 /// 735 736 ///Returns a const reference to the node map that stores the predecessor 736 ///arcs, which form the DFS tree .737 ///arcs, which form the DFS tree (forest). 737 738 /// 738 739 ///\pre Either \ref run(Node) "run()" or \ref init() … … 740 741 const PredMap &predMap() const { return *_pred;} 741 742 742 ///Checks if anode is reached from the root(s).743 ///Checks if the given node. node is reached from the root(s). 743 744 744 745 ///Returns \c true if \c v is reached from the root(s). … … 766 767 ///The type of the map that stores the predecessor 767 768 ///arcs of the %DFS paths. 768 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.769 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 769 770 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 770 771 ///Instantiates a PredMap. … … 781 782 782 783 ///The type of the map that indicates which nodes are processed. 783 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.784 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 784 785 ///By default it is a NullMap. 785 786 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; … … 801 802 802 803 ///The type of the map that indicates which nodes are reached. 803 ///It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.804 ///It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 804 805 typedef typename Digraph::template NodeMap<bool> ReachedMap; 805 806 ///Instantiates a ReachedMap. … … 816 817 817 818 ///The type of the map that stores the distances of the nodes. 818 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.819 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 819 820 typedef typename Digraph::template NodeMap<int> DistMap; 820 821 ///Instantiates a DistMap. … … 831 832 832 833 ///The type of the DFS paths. 833 ///It must meetthe \ref concepts::Path "Path" concept.834 ///It must conform to the \ref concepts::Path "Path" concept. 834 835 typedef lemon::Path<Digraph> Path; 835 836 }; … … 837 838 /// Default traits class used by DfsWizard 838 839 839 /// To make it easier to use Dfs algorithm 840 /// we have created a wizard class. 841 /// This \ref DfsWizard class needs default traits, 842 /// as well as the \ref Dfs class. 843 /// The \ref DfsWizardBase is a class to be the default traits of the 844 /// \ref DfsWizard class. 840 /// Default traits class used by DfsWizard. 841 /// \tparam GR The type of the digraph. 845 842 template<class GR> 846 843 class DfsWizardBase : public DfsWizardDefaultTraits<GR> … … 870 867 /// Constructor. 871 868 872 /// This constructor does not require parameters, thereforeit initiates869 /// This constructor does not require parameters, it initiates 873 870 /// all of the attributes to \c 0. 874 871 DfsWizardBase() : _g(0), _reached(0), _processed(0), _pred(0), … … 900 897 typedef TR Base; 901 898 902 ///The type of the digraph the algorithm runs on.903 899 typedef typename TR::Digraph Digraph; 904 900 … … 908 904 typedef typename Digraph::OutArcIt OutArcIt; 909 905 910 ///\brief The type of the map that stores the predecessor911 ///arcs of the DFS paths.912 906 typedef typename TR::PredMap PredMap; 913 ///\brief The type of the map that stores the distances of the nodes.914 907 typedef typename TR::DistMap DistMap; 915 ///\brief The type of the map that indicates which nodes are reached.916 908 typedef typename TR::ReachedMap ReachedMap; 917 ///\brief The type of the map that indicates which nodes are processed.918 909 typedef typename TR::ProcessedMap ProcessedMap; 919 ///The type of the DFS paths920 910 typedef typename TR::Path Path; 921 911 … … 1000 990 SetPredMapBase(const TR &b) : TR(b) {} 1001 991 }; 1002 ///\brief \ref named-func-param "Named parameter" 1003 ///for setting PredMap object. 1004 /// 1005 ///\ref named-func-param "Named parameter" 1006 ///for setting PredMap object. 992 993 ///\brief \ref named-templ-param "Named parameter" for setting 994 ///the predecessor map. 995 /// 996 ///\ref named-templ-param "Named parameter" function for setting 997 ///the map that stores the predecessor arcs of the nodes. 1007 998 template<class T> 1008 999 DfsWizard<SetPredMapBase<T> > predMap(const T &t) … … 1018 1009 SetReachedMapBase(const TR &b) : TR(b) {} 1019 1010 }; 1020 ///\brief \ref named-func-param "Named parameter" 1021 ///for setting ReachedMap object. 1022 /// 1023 /// \ref named-func-param "Named parameter" 1024 ///for setting ReachedMap object. 1011 1012 ///\brief \ref named-templ-param "Named parameter" for setting 1013 ///the reached map. 1014 /// 1015 ///\ref named-templ-param "Named parameter" function for setting 1016 ///the map that indicates which nodes are reached. 1025 1017 template<class T> 1026 1018 DfsWizard<SetReachedMapBase<T> > reachedMap(const T &t) … … 1036 1028 SetDistMapBase(const TR &b) : TR(b) {} 1037 1029 }; 1038 ///\brief \ref named-func-param "Named parameter" 1039 ///for setting DistMap object. 1040 /// 1041 /// \ref named-func-param "Named parameter" 1042 ///for setting DistMap object. 1030 1031 ///\brief \ref named-templ-param "Named parameter" for setting 1032 ///the distance map. 1033 /// 1034 ///\ref named-templ-param "Named parameter" function for setting 1035 ///the map that stores the distances of the nodes calculated 1036 ///by the algorithm. 1043 1037 template<class T> 1044 1038 DfsWizard<SetDistMapBase<T> > distMap(const T &t) … … 1054 1048 SetProcessedMapBase(const TR &b) : TR(b) {} 1055 1049 }; 1056 ///\brief \ref named-func-param "Named parameter" 1057 ///for setting ProcessedMap object. 1058 /// 1059 /// \ref named-func-param "Named parameter" 1060 ///for setting ProcessedMap object. 1050 1051 ///\brief \ref named-func-param "Named parameter" for setting 1052 ///the processed map. 1053 /// 1054 ///\ref named-templ-param "Named parameter" function for setting 1055 ///the map that indicates which nodes are processed. 1061 1056 template<class T> 1062 1057 DfsWizard<SetProcessedMapBase<T> > processedMap(const T &t) … … 1209 1204 /// 1210 1205 /// The type of the map that indicates which nodes are reached. 1211 /// It must meetthe \ref concepts::ReadWriteMap "ReadWriteMap" concept.1206 /// It must conform to the \ref concepts::ReadWriteMap "ReadWriteMap" concept. 1212 1207 typedef typename Digraph::template NodeMap<bool> ReachedMap; 1213 1208 … … 1621 1616 ///@{ 1622 1617 1623 /// \brief Checks if anode is reached from the root(s).1618 /// \brief Checks if the given node is reached from the root(s). 1624 1619 /// 1625 1620 /// Returns \c true if \c v is reached from the root(s). -
lemon/dfs.h
r716 r717 413 413 ///The simplest way to execute the DFS algorithm is to use one of the 414 414 ///member functions called \ref run(Node) "run()".\n 415 ///If you need more control on the execution, firstyou have to call416 ///\ref init() , then you can add a source node with \ref addSource()415 ///If you need better control on the execution, you have to call 416 ///\ref init() first, then you can add a source node with \ref addSource() 417 417 ///and perform the actual computation with \ref start(). 418 418 ///This procedure can be repeated if there are nodes that have not … … 1365 1365 /// The simplest way to execute the DFS algorithm is to use one of the 1366 1366 /// member functions called \ref run(Node) "run()".\n 1367 /// If you need more control on the execution, firstyou have to call1368 /// \ref init() , then you can add a source node with \ref addSource()1367 /// If you need better control on the execution, you have to call 1368 /// \ref init() first, then you can add a source node with \ref addSource() 1369 1369 /// and perform the actual computation with \ref start(). 1370 1370 /// This procedure can be repeated if there are nodes that have not -
lemon/dijkstra.h
r713 r717 71 71 72 72 ///The type of the map that stores the arc lengths. 73 ///It must meetthe \ref concepts::ReadMap "ReadMap" concept.73 ///It must conform to the \ref concepts::ReadMap "ReadMap" concept. 74 74 typedef LEN LengthMap; 75 ///The type of the length of the arcs.75 ///The type of the arc lengths. 76 76 typedef typename LEN::Value Value; 77 77 … … 117 117 ///The type of the map that stores the predecessor 118 118 ///arcs of the shortest paths. 119 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.119 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 120 120 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 121 121 ///Instantiates a \c PredMap. … … 132 132 133 133 ///The type of the map that indicates which nodes are processed. 134 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.134 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 135 135 ///By default it is a NullMap. 136 136 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; … … 152 152 153 153 ///The type of the map that stores the distances of the nodes. 154 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.154 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 155 155 typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap; 156 156 ///Instantiates a \c DistMap. … … 169 169 /// \ingroup shortest_path 170 170 ///This class provides an efficient implementation of the %Dijkstra algorithm. 171 /// 172 ///The %Dijkstra algorithm solves the single-source shortest path problem 173 ///when all arc lengths are non-negative. If there are negative lengths, 174 ///the BellmanFord algorithm should be used instead. 171 175 /// 172 176 ///The arc lengths are passed to the algorithm using a … … 202 206 typedef typename TR::Digraph Digraph; 203 207 204 ///The type of the length of the arcs.208 ///The type of the arc lengths. 205 209 typedef typename TR::LengthMap::Value Value; 206 210 ///The type of the map that stores the arc lengths. … … 305 309 ///\ref named-templ-param "Named parameter" for setting 306 310 ///\c PredMap type. 307 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.311 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 308 312 template <class T> 309 313 struct SetPredMap … … 326 330 ///\ref named-templ-param "Named parameter" for setting 327 331 ///\c DistMap type. 328 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.332 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 329 333 template <class T> 330 334 struct SetDistMap … … 347 351 ///\ref named-templ-param "Named parameter" for setting 348 352 ///\c ProcessedMap type. 349 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.353 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 350 354 template <class T> 351 355 struct SetProcessedMap … … 444 448 ///\ref named-templ-param "Named parameter" for setting 445 449 ///\c OperationTraits type. 450 /// For more information see \ref DijkstraDefaultOperationTraits. 446 451 template <class T> 447 452 struct SetOperationTraits … … 802 807 ///The results of the %Dijkstra algorithm can be obtained using these 803 808 ///functions.\n 804 ///Either \ref run(Node) "run()" or \ref start() should be called809 ///Either \ref run(Node) "run()" or \ref init() should be called 805 810 ///before using them. 806 811 807 812 ///@{ 808 813 809 ///The shortest path to anode.810 811 ///Returns the shortest path to a node.814 ///The shortest path to the given node. 815 816 ///Returns the shortest path to the given node from the root(s). 812 817 /// 813 818 ///\warning \c t should be reached from the root(s). … … 817 822 Path path(Node t) const { return Path(*G, *_pred, t); } 818 823 819 ///The distance of anode from the root(s).820 821 ///Returns the distance of anode from the root(s).824 ///The distance of the given node from the root(s). 825 826 ///Returns the distance of the given node from the root(s). 822 827 /// 823 828 ///\warning If node \c v is not reached from the root(s), then … … 828 833 Value dist(Node v) const { return (*_dist)[v]; } 829 834 830 ///Returns the 'previous arc' of the shortest path tree for a node. 831 835 ///\brief Returns the 'previous arc' of the shortest path tree for 836 ///the given node. 837 /// 832 838 ///This function returns the 'previous arc' of the shortest path 833 839 ///tree for the node \c v, i.e. it returns the last arc of a … … 836 842 /// 837 843 ///The shortest path tree used here is equal to the shortest path 838 ///tree used in \ref predNode() .844 ///tree used in \ref predNode() and \ref predMap(). 839 845 /// 840 846 ///\pre Either \ref run(Node) "run()" or \ref init() … … 842 848 Arc predArc(Node v) const { return (*_pred)[v]; } 843 849 844 ///Returns the 'previous node' of the shortest path tree for a node. 845 850 ///\brief Returns the 'previous node' of the shortest path tree for 851 ///the given node. 852 /// 846 853 ///This function returns the 'previous node' of the shortest path 847 854 ///tree for the node \c v, i.e. it returns the last but one node 848 /// froma shortest path from a root to \c v. It is \c INVALID855 ///of a shortest path from a root to \c v. It is \c INVALID 849 856 ///if \c v is not reached from the root(s) or if \c v is a root. 850 857 /// 851 858 ///The shortest path tree used here is equal to the shortest path 852 ///tree used in \ref predArc() .859 ///tree used in \ref predArc() and \ref predMap(). 853 860 /// 854 861 ///\pre Either \ref run(Node) "run()" or \ref init() … … 871 878 /// 872 879 ///Returns a const reference to the node map that stores the predecessor 873 ///arcs, which form the shortest path tree .880 ///arcs, which form the shortest path tree (forest). 874 881 /// 875 882 ///\pre Either \ref run(Node) "run()" or \ref init() … … 877 884 const PredMap &predMap() const { return *_pred;} 878 885 879 ///Checks if anode is reached from the root(s).886 ///Checks if the given node is reached from the root(s). 880 887 881 888 ///Returns \c true if \c v is reached from the root(s). … … 896 903 Heap::POST_HEAP; } 897 904 898 ///The current distance of anode from the root(s).899 900 ///Returns the current distance of anode from the root(s).905 ///The current distance of the given node from the root(s). 906 907 ///Returns the current distance of the given node from the root(s). 901 908 ///It may be decreased in the following processes. 902 909 /// … … 925 932 926 933 ///The type of the map that stores the arc lengths. 927 ///It must meetthe \ref concepts::ReadMap "ReadMap" concept.934 ///It must conform to the \ref concepts::ReadMap "ReadMap" concept. 928 935 typedef LEN LengthMap; 929 ///The type of the length of the arcs.936 ///The type of the arc lengths. 930 937 typedef typename LEN::Value Value; 931 938 … … 974 981 ///The type of the map that stores the predecessor 975 982 ///arcs of the shortest paths. 976 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.983 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 977 984 typedef typename Digraph::template NodeMap<typename Digraph::Arc> PredMap; 978 985 ///Instantiates a PredMap. … … 989 996 990 997 ///The type of the map that indicates which nodes are processed. 991 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.998 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 992 999 ///By default it is a NullMap. 993 1000 typedef NullMap<typename Digraph::Node,bool> ProcessedMap; … … 1009 1016 1010 1017 ///The type of the map that stores the distances of the nodes. 1011 ///It must meetthe \ref concepts::WriteMap "WriteMap" concept.1018 ///It must conform to the \ref concepts::WriteMap "WriteMap" concept. 1012 1019 typedef typename Digraph::template NodeMap<typename LEN::Value> DistMap; 1013 1020 ///Instantiates a DistMap. … … 1024 1031 1025 1032 ///The type of the shortest paths. 1026 ///It must meetthe \ref concepts::Path "Path" concept.1033 ///It must conform to the \ref concepts::Path "Path" concept. 1027 1034 typedef lemon::Path<Digraph> Path; 1028 1035 }; … … 1030 1037 /// Default traits class used by DijkstraWizard 1031 1038 1032 /// To make it easier to use Dijkstra algorithm 1033 /// we have created a wizard class. 1034 /// This \ref DijkstraWizard class needs default traits, 1035 /// as well as the \ref Dijkstra class. 1036 /// The \ref DijkstraWizardBase is a class to be the default traits of the 1037 /// \ref DijkstraWizard class. 1039 /// Default traits class used by DijkstraWizard. 1040 /// \tparam GR The type of the digraph. 1041 /// \tparam LEN The type of the length map. 1038 1042 template<typename GR, typename LEN> 1039 1043 class DijkstraWizardBase : public DijkstraWizardDefaultTraits<GR,LEN> … … 1094 1098 typedef TR Base; 1095 1099 1096 ///The type of the digraph the algorithm runs on.1097 1100 typedef typename TR::Digraph Digraph; 1098 1101 … … 1102 1105 typedef typename Digraph::OutArcIt OutArcIt; 1103 1106 1104 ///The type of the map that stores the arc lengths.1105 1107 typedef typename TR::LengthMap LengthMap; 1106 ///The type of the length of the arcs.1107 1108 typedef typename LengthMap::Value Value; 1108 ///\brief The type of the map that stores the predecessor1109 ///arcs of the shortest paths.1110 1109 typedef typename TR::PredMap PredMap; 1111 ///The type of the map that stores the distances of the nodes.1112 1110 typedef typename TR::DistMap DistMap; 1113 ///The type of the map that indicates which nodes are processed.1114 1111 typedef typename TR::ProcessedMap ProcessedMap; 1115 ///The type of the shortest paths1116 1112 typedef typename TR::Path Path; 1117 ///The heap type used by the dijkstra algorithm.1118 1113 typedef typename TR::Heap Heap; 1119 1114 … … 1187 1182 SetPredMapBase(const TR &b) : TR(b) {} 1188 1183 }; 1189 ///\brief \ref named-func-param "Named parameter" 1190 ///for setting PredMap object. 1191 /// 1192 ///\ref named-func-param "Named parameter" 1193 ///for setting PredMap object. 1184 1185 ///\brief \ref named-templ-param "Named parameter" for setting 1186 ///the predecessor map. 1187 /// 1188 ///\ref named-templ-param "Named parameter" function for setting 1189 ///the map that stores the predecessor arcs of the nodes. 1194 1190 template<class T> 1195 1191 DijkstraWizard<SetPredMapBase<T> > predMap(const T &t) … … 1205 1201 SetDistMapBase(const TR &b) : TR(b) {} 1206 1202 }; 1207 ///\brief \ref named-func-param "Named parameter" 1208 ///for setting DistMap object. 1209 /// 1210 ///\ref named-func-param "Named parameter" 1211 ///for setting DistMap object. 1203 1204 ///\brief \ref named-templ-param "Named parameter" for setting 1205 ///the distance map. 1206 /// 1207 ///\ref named-templ-param "Named parameter" function for setting 1208 ///the map that stores the distances of the nodes calculated 1209 ///by the algorithm. 1212 1210 template<class T> 1213 1211 DijkstraWizard<SetDistMapBase<T> > distMap(const T &t) … … 1223 1221 SetProcessedMapBase(const TR &b) : TR(b) {} 1224 1222 }; 1225 ///\brief \ref named-func-param "Named parameter" 1226 ///for setting ProcessedMap object. 1227 /// 1228 /// \ref named-func-param "Named parameter" 1229 ///for setting ProcessedMap object. 1223 1224 ///\brief \ref named-func-param "Named parameter" for setting 1225 ///the processed map. 1226 /// 1227 ///\ref named-templ-param "Named parameter" function for setting 1228 ///the map that indicates which nodes are processed. 1230 1229 template<class T> 1231 1230 DijkstraWizard<SetProcessedMapBase<T> > processedMap(const T &t) … … 1240 1239 SetPathBase(const TR &b) : TR(b) {} 1241 1240 }; 1241 1242 1242 ///\brief \ref named-func-param "Named parameter" 1243 1243 ///for getting the shortest path to the target node. -
lemon/dijkstra.h
r716 r717 590 590 ///The simplest way to execute the %Dijkstra algorithm is to use 591 591 ///one of the member functions called \ref run(Node) "run()".\n 592 ///If you need more control on the execution, firstyou have to call593 ///\ref init() , then you can add several source nodes with592 ///If you need better control on the execution, you have to call 593 ///\ref init() first, then you can add several source nodes with 594 594 ///\ref addSource(). Finally the actual path computation can be 595 595 ///performed with one of the \ref start() functions. -
lemon/maps.h
r695 r717 1790 1790 /// \code 1791 1791 /// std::vector<Node> v; 1792 /// dfs(g ,s).processedMap(loggerBoolMap(std::back_inserter(v))).run();1792 /// dfs(g).processedMap(loggerBoolMap(std::back_inserter(v))).run(s); 1793 1793 /// \endcode 1794 1794 /// \code 1795 1795 /// std::vector<Node> v(countNodes(g)); 1796 /// dfs(g ,s).processedMap(loggerBoolMap(v.begin())).run();1796 /// dfs(g).processedMap(loggerBoolMap(v.begin())).run(s); 1797 1797 /// \endcode 1798 1798 /// -
lemon/maps.h
r716 r717 23 23 #include <functional> 24 24 #include <vector> 25 #include <map> 25 26 26 27 #include <lemon/core.h> … … 29 30 ///\ingroup maps 30 31 ///\brief Miscellaneous property maps 31 32 #include <map>33 32 34 33 namespace lemon { … … 1819 1818 /// 1820 1819 /// IdMap provides a unique and immutable id for each item of the 1821 /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 1820 /// same type (\c Node, \c Arc or \c Edge) in a graph. This id is 1822 1821 /// - \b unique: different items get different ids, 1823 1822 /// - \b immutable: the id of an item does not change (even if you … … 1903 1902 1904 1903 /// This class provides simple invertable graph maps. 1905 /// It wraps an arbitrary \ref concepts::ReadWriteMap "ReadWriteMap" 1906 /// and if a key is set to a new value then store it 1907 /// in the inverse map. 1908 /// 1904 /// It wraps a standard graph map (\c NodeMap, \c ArcMap or \c EdgeMap) 1905 /// and if a key is set to a new value, then stores it in the inverse map. 1909 1906 /// The values of the map can be accessed 1910 1907 /// with stl compatible forward iterator. 1908 /// 1909 /// This type is not reference map, so it cannot be modified with 1910 /// the subscript operator. 1911 1911 /// 1912 1912 /// \tparam GR The graph type. … … 1924 1924 template Map<V>::Type Map; 1925 1925 1926 typedef std::m ap<V, K> Container;1926 typedef std::multimap<V, K> Container; 1927 1927 Container _inv_map; 1928 1928 … … 1949 1949 /// iterator on the values of the map. The values can 1950 1950 /// be accessed in the <tt>[beginValue, endValue)</tt> range. 1951 /// They are considered with multiplicity, so each value is 1952 /// traversed for each item it is assigned to. 1951 1953 class ValueIterator 1952 1954 : public std::iterator<std::forward_iterator_tag, Value> { … … 2001 2003 void set(const Key& key, const Value& val) { 2002 2004 Value oldval = Map::operator[](key); 2003 typename Container::iterator it = _inv_map.find(oldval); 2004 if (it != _inv_map.end() && it->second == key) { 2005 _inv_map.erase(it); 2006 } 2007 _inv_map.insert(make_pair(val, key)); 2005 typename Container::iterator it; 2006 for (it = _inv_map.equal_range(oldval).first; 2007 it != _inv_map.equal_range(oldval).second; ++it) { 2008 if (it->second == key) { 2009 _inv_map.erase(it); 2010 break; 2011 } 2012 } 2013 _inv_map.insert(std::make_pair(val, key)); 2008 2014 Map::set(key, val); 2009 2015 } … … 2017 2023 } 2018 2024 2019 /// \brief Gives back the item by its value. 2020 /// 2021 /// Gives back the item by its value. 2022 Key operator()(const Value& key) const { 2023 typename Container::const_iterator it = _inv_map.find(key); 2025 /// \brief Gives back an item by its value. 2026 /// 2027 /// This function gives back an item that is assigned to 2028 /// the given value or \c INVALID if no such item exists. 2029 /// If there are more items with the same associated value, 2030 /// only one of them is returned. 2031 Key operator()(const Value& val) const { 2032 typename Container::const_iterator it = _inv_map.find(val); 2024 2033 return it != _inv_map.end() ? it->second : INVALID; 2025 2034 } … … 2033 2042 virtual void erase(const Key& key) { 2034 2043 Value val = Map::operator[](key); 2035 typename Container::iterator it = _inv_map.find(val); 2036 if (it != _inv_map.end() && it->second == key) { 2037 _inv_map.erase(it); 2044 typename Container::iterator it; 2045 for (it = _inv_map.equal_range(val).first; 2046 it != _inv_map.equal_range(val).second; ++it) { 2047 if (it->second == key) { 2048 _inv_map.erase(it); 2049 break; 2050 } 2038 2051 } 2039 2052 Map::erase(key); … … 2047 2060 for (int i = 0; i < int(keys.size()); ++i) { 2048 2061 Value val = Map::operator[](keys[i]); 2049 typename Container::iterator it = _inv_map.find(val); 2050 if (it != _inv_map.end() && it->second == keys[i]) { 2051 _inv_map.erase(it); 2062 typename Container::iterator it; 2063 for (it = _inv_map.equal_range(val).first; 2064 it != _inv_map.equal_range(val).second; ++it) { 2065 if (it->second == keys[i]) { 2066 _inv_map.erase(it); 2067 break; 2068 } 2052 2069 } 2053 2070 } … … 2085 2102 /// \brief Subscript operator. 2086 2103 /// 2087 /// Subscript operator. It gives back the item 2088 /// that was last assigned to the given value. 2104 /// Subscript operator. It gives back an item 2105 /// that is assigned to the given value or \c INVALID 2106 /// if no such item exists. 2089 2107 Value operator[](const Key& key) const { 2090 2108 return _inverted(key); … … 2255 2273 2256 2274 /// \brief Gives back the item belonging to a \e RangeId 2257 /// 2275 /// 2258 2276 /// Gives back the item belonging to a \e RangeId. 2259 2277 Item operator()(int id) const { … … 2312 2330 }; 2313 2331 2332 /// \brief Dynamic iterable \c bool map. 2333 /// 2334 /// This class provides a special graph map type which can store a 2335 /// \c bool value for graph items (\c Node, \c Arc or \c Edge). 2336 /// For both \c true and \c false values it is possible to iterate on 2337 /// the keys. 2338 /// 2339 /// This type is a reference map, so it can be modified with the 2340 /// subscript operator. 2341 /// 2342 /// \tparam GR The graph type. 2343 /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or 2344 /// \c GR::Edge). 2345 /// 2346 /// \see IterableIntMap, IterableValueMap 2347 /// \see CrossRefMap 2348 template <typename GR, typename K> 2349 class IterableBoolMap 2350 : protected ItemSetTraits<GR, K>::template Map<int>::Type { 2351 private: 2352 typedef GR Graph; 2353 2354 typedef typename ItemSetTraits<GR, K>::ItemIt KeyIt; 2355 typedef typename ItemSetTraits<GR, K>::template Map<int>::Type Parent; 2356 2357 std::vector<K> _array; 2358 int _sep; 2359 2360 public: 2361 2362 /// Indicates that the map is reference map. 2363 typedef True ReferenceMapTag; 2364 2365 /// The key type 2366 typedef K Key; 2367 /// The value type 2368 typedef bool Value; 2369 /// The const reference type. 2370 typedef const Value& ConstReference; 2371 2372 private: 2373 2374 int position(const Key& key) const { 2375 return Parent::operator[](key); 2376 } 2377 2378 public: 2379 2380 /// \brief Reference to the value of the map. 2381 /// 2382 /// This class is similar to the \c bool type. It can be converted to 2383 /// \c bool and it provides the same operators. 2384 class Reference { 2385 friend class IterableBoolMap; 2386 private: 2387 Reference(IterableBoolMap& map, const Key& key) 2388 : _key(key), _map(map) {} 2389 public: 2390 2391 Reference& operator=(const Reference& value) { 2392 _map.set(_key, static_cast<bool>(value)); 2393 return *this; 2394 } 2395 2396 operator bool() const { 2397 return static_cast<const IterableBoolMap&>(_map)[_key]; 2398 } 2399 2400 Reference& operator=(bool value) { 2401 _map.set(_key, value); 2402 return *this; 2403 } 2404 Reference& operator&=(bool value) { 2405 _map.set(_key, _map[_key] & value); 2406 return *this; 2407 } 2408 Reference& operator|=(bool value) { 2409 _map.set(_key, _map[_key] | value); 2410 return *this; 2411 } 2412 Reference& operator^=(bool value) { 2413 _map.set(_key, _map[_key] ^ value); 2414 return *this; 2415 } 2416 private: 2417 Key _key; 2418 IterableBoolMap& _map; 2419 }; 2420 2421 /// \brief Constructor of the map with a default value. 2422 /// 2423 /// Constructor of the map with a default value. 2424 explicit IterableBoolMap(const Graph& graph, bool def = false) 2425 : Parent(graph) { 2426 typename Parent::Notifier* nf = Parent::notifier(); 2427 Key it; 2428 for (nf->first(it); it != INVALID; nf->next(it)) { 2429 Parent::set(it, _array.size()); 2430 _array.push_back(it); 2431 } 2432 _sep = (def ? _array.size() : 0); 2433 } 2434 2435 /// \brief Const subscript operator of the map. 2436 /// 2437 /// Const subscript operator of the map. 2438 bool operator[](const Key& key) const { 2439 return position(key) < _sep; 2440 } 2441 2442 /// \brief Subscript operator of the map. 2443 /// 2444 /// Subscript operator of the map. 2445 Reference operator[](const Key& key) { 2446 return Reference(*this, key); 2447 } 2448 2449 /// \brief Set operation of the map. 2450 /// 2451 /// Set operation of the map. 2452 void set(const Key& key, bool value) { 2453 int pos = position(key); 2454 if (value) { 2455 if (pos < _sep) return; 2456 Key tmp = _array[_sep]; 2457 _array[_sep] = key; 2458 Parent::set(key, _sep); 2459 _array[pos] = tmp; 2460 Parent::set(tmp, pos); 2461 ++_sep; 2462 } else { 2463 if (pos >= _sep) return; 2464 --_sep; 2465 Key tmp = _array[_sep]; 2466 _array[_sep] = key; 2467 Parent::set(key, _sep); 2468 _array[pos] = tmp; 2469 Parent::set(tmp, pos); 2470 } 2471 } 2472 2473 /// \brief Set all items. 2474 /// 2475 /// Set all items in the map. 2476 /// \note Constant time operation. 2477 void setAll(bool value) { 2478 _sep = (value ? _array.size() : 0); 2479 } 2480 2481 /// \brief Returns the number of the keys mapped to \c true. 2482 /// 2483 /// Returns the number of the keys mapped to \c true. 2484 int trueNum() const { 2485 return _sep; 2486 } 2487 2488 /// \brief Returns the number of the keys mapped to \c false. 2489 /// 2490 /// Returns the number of the keys mapped to \c false. 2491 int falseNum() const { 2492 return _array.size() - _sep; 2493 } 2494 2495 /// \brief Iterator for the keys mapped to \c true. 2496 /// 2497 /// Iterator for the keys mapped to \c true. It works 2498 /// like a graph item iterator, it can be converted to 2499 /// the key type of the map, incremented with \c ++ operator, and 2500 /// if the iterator leaves the last valid key, it will be equal to 2501 /// \c INVALID. 2502 class TrueIt : public Key { 2503 public: 2504 typedef Key Parent; 2505 2506 /// \brief Creates an iterator. 2507 /// 2508 /// Creates an iterator. It iterates on the 2509 /// keys mapped to \c true. 2510 /// \param map The IterableBoolMap. 2511 explicit TrueIt(const IterableBoolMap& map) 2512 : Parent(map._sep > 0 ? map._array[map._sep - 1] : INVALID), 2513 _map(&map) {} 2514 2515 /// \brief Invalid constructor \& conversion. 2516 /// 2517 /// This constructor initializes the iterator to be invalid. 2518 /// \sa Invalid for more details. 2519 TrueIt(Invalid) : Parent(INVALID), _map(0) {} 2520 2521 /// \brief Increment operator. 2522 /// 2523 /// Increment operator. 2524 TrueIt& operator++() { 2525 int pos = _map->position(*this); 2526 Parent::operator=(pos > 0 ? _map->_array[pos - 1] : INVALID); 2527 return *this; 2528 } 2529 2530 private: 2531 const IterableBoolMap* _map; 2532 }; 2533 2534 /// \brief Iterator for the keys mapped to \c false. 2535 /// 2536 /// Iterator for the keys mapped to \c false. It works 2537 /// like a graph item iterator, it can be converted to 2538 /// the key type of the map, incremented with \c ++ operator, and 2539 /// if the iterator leaves the last valid key, it will be equal to 2540 /// \c INVALID. 2541 class FalseIt : public Key { 2542 public: 2543 typedef Key Parent; 2544 2545 /// \brief Creates an iterator. 2546 /// 2547 /// Creates an iterator. It iterates on the 2548 /// keys mapped to \c false. 2549 /// \param map The IterableBoolMap. 2550 explicit FalseIt(const IterableBoolMap& map) 2551 : Parent(map._sep < int(map._array.size()) ? 2552 map._array.back() : INVALID), _map(&map) {} 2553 2554 /// \brief Invalid constructor \& conversion. 2555 /// 2556 /// This constructor initializes the iterator to be invalid. 2557 /// \sa Invalid for more details. 2558 FalseIt(Invalid) : Parent(INVALID), _map(0) {} 2559 2560 /// \brief Increment operator. 2561 /// 2562 /// Increment operator. 2563 FalseIt& operator++() { 2564 int pos = _map->position(*this); 2565 Parent::operator=(pos > _map->_sep ? _map->_array[pos - 1] : INVALID); 2566 return *this; 2567 } 2568 2569 private: 2570 const IterableBoolMap* _map; 2571 }; 2572 2573 /// \brief Iterator for the keys mapped to a given value. 2574 /// 2575 /// Iterator for the keys mapped to a given value. It works 2576 /// like a graph item iterator, it can be converted to 2577 /// the key type of the map, incremented with \c ++ operator, and 2578 /// if the iterator leaves the last valid key, it will be equal to 2579 /// \c INVALID. 2580 class ItemIt : public Key { 2581 public: 2582 typedef Key Parent; 2583 2584 /// \brief Creates an iterator with a value. 2585 /// 2586 /// Creates an iterator with a value. It iterates on the 2587 /// keys mapped to the given value. 2588 /// \param map The IterableBoolMap. 2589 /// \param value The value. 2590 ItemIt(const IterableBoolMap& map, bool value) 2591 : Parent(value ? 2592 (map._sep > 0 ? 2593 map._array[map._sep - 1] : INVALID) : 2594 (map._sep < int(map._array.size()) ? 2595 map._array.back() : INVALID)), _map(&map) {} 2596 2597 /// \brief Invalid constructor \& conversion. 2598 /// 2599 /// This constructor initializes the iterator to be invalid. 2600 /// \sa Invalid for more details. 2601 ItemIt(Invalid) : Parent(INVALID), _map(0) {} 2602 2603 /// \brief Increment operator. 2604 /// 2605 /// Increment operator. 2606 ItemIt& operator++() { 2607 int pos = _map->position(*this); 2608 int _sep = pos >= _map->_sep ? _map->_sep : 0; 2609 Parent::operator=(pos > _sep ? _map->_array[pos - 1] : INVALID); 2610 return *this; 2611 } 2612 2613 private: 2614 const IterableBoolMap* _map; 2615 }; 2616 2617 protected: 2618 2619 virtual void add(const Key& key) { 2620 Parent::add(key); 2621 Parent::set(key, _array.size()); 2622 _array.push_back(key); 2623 } 2624 2625 virtual void add(const std::vector<Key>& keys) { 2626 Parent::add(keys); 2627 for (int i = 0; i < int(keys.size()); ++i) { 2628 Parent::set(keys[i], _array.size()); 2629 _array.push_back(keys[i]); 2630 } 2631 } 2632 2633 virtual void erase(const Key& key) { 2634 int pos = position(key); 2635 if (pos < _sep) { 2636 --_sep; 2637 Parent::set(_array[_sep], pos); 2638 _array[pos] = _array[_sep]; 2639 Parent::set(_array.back(), _sep); 2640 _array[_sep] = _array.back(); 2641 _array.pop_back(); 2642 } else { 2643 Parent::set(_array.back(), pos); 2644 _array[pos] = _array.back(); 2645 _array.pop_back(); 2646 } 2647 Parent::erase(key); 2648 } 2649 2650 virtual void erase(const std::vector<Key>& keys) { 2651 for (int i = 0; i < int(keys.size()); ++i) { 2652 int pos = position(keys[i]); 2653 if (pos < _sep) { 2654 --_sep; 2655 Parent::set(_array[_sep], pos); 2656 _array[pos] = _array[_sep]; 2657 Parent::set(_array.back(), _sep); 2658 _array[_sep] = _array.back(); 2659 _array.pop_back(); 2660 } else { 2661 Parent::set(_array.back(), pos); 2662 _array[pos] = _array.back(); 2663 _array.pop_back(); 2664 } 2665 } 2666 Parent::erase(keys); 2667 } 2668 2669 virtual void build() { 2670 Parent::build(); 2671 typename Parent::Notifier* nf = Parent::notifier(); 2672 Key it; 2673 for (nf->first(it); it != INVALID; nf->next(it)) { 2674 Parent::set(it, _array.size()); 2675 _array.push_back(it); 2676 } 2677 _sep = 0; 2678 } 2679 2680 virtual void clear() { 2681 _array.clear(); 2682 _sep = 0; 2683 Parent::clear(); 2684 } 2685 2686 }; 2687 2688 2689 namespace _maps_bits { 2690 template <typename Item> 2691 struct IterableIntMapNode { 2692 IterableIntMapNode() : value(-1) {} 2693 IterableIntMapNode(int _value) : value(_value) {} 2694 Item prev, next; 2695 int value; 2696 }; 2697 } 2698 2699 /// \brief Dynamic iterable integer map. 2700 /// 2701 /// This class provides a special graph map type which can store an 2702 /// integer value for graph items (\c Node, \c Arc or \c Edge). 2703 /// For each non-negative value it is possible to iterate on the keys 2704 /// mapped to the value. 2705 /// 2706 /// This type is a reference map, so it can be modified with the 2707 /// subscript operator. 2708 /// 2709 /// \note The size of the data structure depends on the largest 2710 /// value in the map. 2711 /// 2712 /// \tparam GR The graph type. 2713 /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or 2714 /// \c GR::Edge). 2715 /// 2716 /// \see IterableBoolMap, IterableValueMap 2717 /// \see CrossRefMap 2718 template <typename GR, typename K> 2719 class IterableIntMap 2720 : protected ItemSetTraits<GR, K>:: 2721 template Map<_maps_bits::IterableIntMapNode<K> >::Type { 2722 public: 2723 typedef typename ItemSetTraits<GR, K>:: 2724 template Map<_maps_bits::IterableIntMapNode<K> >::Type Parent; 2725 2726 /// The key type 2727 typedef K Key; 2728 /// The value type 2729 typedef int Value; 2730 /// The graph type 2731 typedef GR Graph; 2732 2733 /// \brief Constructor of the map. 2734 /// 2735 /// Constructor of the map. It sets all values to -1. 2736 explicit IterableIntMap(const Graph& graph) 2737 : Parent(graph) {} 2738 2739 /// \brief Constructor of the map with a given value. 2740 /// 2741 /// Constructor of the map with a given value. 2742 explicit IterableIntMap(const Graph& graph, int value) 2743 : Parent(graph, _maps_bits::IterableIntMapNode<K>(value)) { 2744 if (value >= 0) { 2745 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) { 2746 lace(it); 2747 } 2748 } 2749 } 2750 2751 private: 2752 2753 void unlace(const Key& key) { 2754 typename Parent::Value& node = Parent::operator[](key); 2755 if (node.value < 0) return; 2756 if (node.prev != INVALID) { 2757 Parent::operator[](node.prev).next = node.next; 2758 } else { 2759 _first[node.value] = node.next; 2760 } 2761 if (node.next != INVALID) { 2762 Parent::operator[](node.next).prev = node.prev; 2763 } 2764 while (!_first.empty() && _first.back() == INVALID) { 2765 _first.pop_back(); 2766 } 2767 } 2768 2769 void lace(const Key& key) { 2770 typename Parent::Value& node = Parent::operator[](key); 2771 if (node.value < 0) return; 2772 if (node.value >= int(_first.size())) { 2773 _first.resize(node.value + 1, INVALID); 2774 } 2775 node.prev = INVALID; 2776 node.next = _first[node.value]; 2777 if (node.next != INVALID) { 2778 Parent::operator[](node.next).prev = key; 2779 } 2780 _first[node.value] = key; 2781 } 2782 2783 public: 2784 2785 /// Indicates that the map is reference map. 2786 typedef True ReferenceMapTag; 2787 2788 /// \brief Reference to the value of the map. 2789 /// 2790 /// This class is similar to the \c int type. It can 2791 /// be converted to \c int and it has the same operators. 2792 class Reference { 2793 friend class IterableIntMap; 2794 private: 2795 Reference(IterableIntMap& map, const Key& key) 2796 : _key(key), _map(map) {} 2797 public: 2798 2799 Reference& operator=(const Reference& value) { 2800 _map.set(_key, static_cast<const int&>(value)); 2801 return *this; 2802 } 2803 2804 operator const int&() const { 2805 return static_cast<const IterableIntMap&>(_map)[_key]; 2806 } 2807 2808 Reference& operator=(int value) { 2809 _map.set(_key, value); 2810 return *this; 2811 } 2812 Reference& operator++() { 2813 _map.set(_key, _map[_key] + 1); 2814 return *this; 2815 } 2816 int operator++(int) { 2817 int value = _map[_key]; 2818 _map.set(_key, value + 1); 2819 return value; 2820 } 2821 Reference& operator--() { 2822 _map.set(_key, _map[_key] - 1); 2823 return *this; 2824 } 2825 int operator--(int) { 2826 int value = _map[_key]; 2827 _map.set(_key, value - 1); 2828 return value; 2829 } 2830 Reference& operator+=(int value) { 2831 _map.set(_key, _map[_key] + value); 2832 return *this; 2833 } 2834 Reference& operator-=(int value) { 2835 _map.set(_key, _map[_key] - value); 2836 return *this; 2837 } 2838 Reference& operator*=(int value) { 2839 _map.set(_key, _map[_key] * value); 2840 return *this; 2841 } 2842 Reference& operator/=(int value) { 2843 _map.set(_key, _map[_key] / value); 2844 return *this; 2845 } 2846 Reference& operator%=(int value) { 2847 _map.set(_key, _map[_key] % value); 2848 return *this; 2849 } 2850 Reference& operator&=(int value) { 2851 _map.set(_key, _map[_key] & value); 2852 return *this; 2853 } 2854 Reference& operator|=(int value) { 2855 _map.set(_key, _map[_key] | value); 2856 return *this; 2857 } 2858 Reference& operator^=(int value) { 2859 _map.set(_key, _map[_key] ^ value); 2860 return *this; 2861 } 2862 Reference& operator<<=(int value) { 2863 _map.set(_key, _map[_key] << value); 2864 return *this; 2865 } 2866 Reference& operator>>=(int value) { 2867 _map.set(_key, _map[_key] >> value); 2868 return *this; 2869 } 2870 2871 private: 2872 Key _key; 2873 IterableIntMap& _map; 2874 }; 2875 2876 /// The const reference type. 2877 typedef const Value& ConstReference; 2878 2879 /// \brief Gives back the maximal value plus one. 2880 /// 2881 /// Gives back the maximal value plus one. 2882 int size() const { 2883 return _first.size(); 2884 } 2885 2886 /// \brief Set operation of the map. 2887 /// 2888 /// Set operation of the map. 2889 void set(const Key& key, const Value& value) { 2890 unlace(key); 2891 Parent::operator[](key).value = value; 2892 lace(key); 2893 } 2894 2895 /// \brief Const subscript operator of the map. 2896 /// 2897 /// Const subscript operator of the map. 2898 const Value& operator[](const Key& key) const { 2899 return Parent::operator[](key).value; 2900 } 2901 2902 /// \brief Subscript operator of the map. 2903 /// 2904 /// Subscript operator of the map. 2905 Reference operator[](const Key& key) { 2906 return Reference(*this, key); 2907 } 2908 2909 /// \brief Iterator for the keys with the same value. 2910 /// 2911 /// Iterator for the keys with the same value. It works 2912 /// like a graph item iterator, it can be converted to 2913 /// the item type of the map, incremented with \c ++ operator, and 2914 /// if the iterator leaves the last valid item, it will be equal to 2915 /// \c INVALID. 2916 class ItemIt : public Key { 2917 public: 2918 typedef Key Parent; 2919 2920 /// \brief Invalid constructor \& conversion. 2921 /// 2922 /// This constructor initializes the iterator to be invalid. 2923 /// \sa Invalid for more details. 2924 ItemIt(Invalid) : Parent(INVALID), _map(0) {} 2925 2926 /// \brief Creates an iterator with a value. 2927 /// 2928 /// Creates an iterator with a value. It iterates on the 2929 /// keys mapped to the given value. 2930 /// \param map The IterableIntMap. 2931 /// \param value The value. 2932 ItemIt(const IterableIntMap& map, int value) : _map(&map) { 2933 if (value < 0 || value >= int(_map->_first.size())) { 2934 Parent::operator=(INVALID); 2935 } else { 2936 Parent::operator=(_map->_first[value]); 2937 } 2938 } 2939 2940 /// \brief Increment operator. 2941 /// 2942 /// Increment operator. 2943 ItemIt& operator++() { 2944 Parent::operator=(_map->IterableIntMap::Parent:: 2945 operator[](static_cast<Parent&>(*this)).next); 2946 return *this; 2947 } 2948 2949 private: 2950 const IterableIntMap* _map; 2951 }; 2952 2953 protected: 2954 2955 virtual void erase(const Key& key) { 2956 unlace(key); 2957 Parent::erase(key); 2958 } 2959 2960 virtual void erase(const std::vector<Key>& keys) { 2961 for (int i = 0; i < int(keys.size()); ++i) { 2962 unlace(keys[i]); 2963 } 2964 Parent::erase(keys); 2965 } 2966 2967 virtual void clear() { 2968 _first.clear(); 2969 Parent::clear(); 2970 } 2971 2972 private: 2973 std::vector<Key> _first; 2974 }; 2975 2976 namespace _maps_bits { 2977 template <typename Item, typename Value> 2978 struct IterableValueMapNode { 2979 IterableValueMapNode(Value _value = Value()) : value(_value) {} 2980 Item prev, next; 2981 Value value; 2982 }; 2983 } 2984 2985 /// \brief Dynamic iterable map for comparable values. 2986 /// 2987 /// This class provides a special graph map type which can store an 2988 /// comparable value for graph items (\c Node, \c Arc or \c Edge). 2989 /// For each value it is possible to iterate on the keys mapped to 2990 /// the value. 2991 /// 2992 /// The map stores for each value a linked list with 2993 /// the items which mapped to the value, and the values are stored 2994 /// in balanced binary tree. The values of the map can be accessed 2995 /// with stl compatible forward iterator. 2996 /// 2997 /// This type is not reference map, so it cannot be modified with 2998 /// the subscript operator. 2999 /// 3000 /// \tparam GR The graph type. 3001 /// \tparam K The key type of the map (\c GR::Node, \c GR::Arc or 3002 /// \c GR::Edge). 3003 /// \tparam V The value type of the map. It can be any comparable 3004 /// value type. 3005 /// 3006 /// \see IterableBoolMap, IterableIntMap 3007 /// \see CrossRefMap 3008 template <typename GR, typename K, typename V> 3009 class IterableValueMap 3010 : protected ItemSetTraits<GR, K>:: 3011 template Map<_maps_bits::IterableValueMapNode<K, V> >::Type { 3012 public: 3013 typedef typename ItemSetTraits<GR, K>:: 3014 template Map<_maps_bits::IterableValueMapNode<K, V> >::Type Parent; 3015 3016 /// The key type 3017 typedef K Key; 3018 /// The value type 3019 typedef V Value; 3020 /// The graph type 3021 typedef GR Graph; 3022 3023 public: 3024 3025 /// \brief Constructor of the map with a given value. 3026 /// 3027 /// Constructor of the map with a given value. 3028 explicit IterableValueMap(const Graph& graph, 3029 const Value& value = Value()) 3030 : Parent(graph, _maps_bits::IterableValueMapNode<K, V>(value)) { 3031 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) { 3032 lace(it); 3033 } 3034 } 3035 3036 protected: 3037 3038 void unlace(const Key& key) { 3039 typename Parent::Value& node = Parent::operator[](key); 3040 if (node.prev != INVALID) { 3041 Parent::operator[](node.prev).next = node.next; 3042 } else { 3043 if (node.next != INVALID) { 3044 _first[node.value] = node.next; 3045 } else { 3046 _first.erase(node.value); 3047 } 3048 } 3049 if (node.next != INVALID) { 3050 Parent::operator[](node.next).prev = node.prev; 3051 } 3052 } 3053 3054 void lace(const Key& key) { 3055 typename Parent::Value& node = Parent::operator[](key); 3056 typename std::map<Value, Key>::iterator it = _first.find(node.value); 3057 if (it == _first.end()) { 3058 node.prev = node.next = INVALID; 3059 _first.insert(std::make_pair(node.value, key)); 3060 } else { 3061 node.prev = INVALID; 3062 node.next = it->second; 3063 if (node.next != INVALID) { 3064 Parent::operator[](node.next).prev = key; 3065 } 3066 it->second = key; 3067 } 3068 } 3069 3070 public: 3071 3072 /// \brief Forward iterator for values. 3073 /// 3074 /// This iterator is an stl compatible forward 3075 /// iterator on the values of the map. The values can 3076 /// be accessed in the <tt>[beginValue, endValue)</tt> range. 3077 class ValueIterator 3078 : public std::iterator<std::forward_iterator_tag, Value> { 3079 friend class IterableValueMap; 3080 private: 3081 ValueIterator(typename std::map<Value, Key>::const_iterator _it) 3082 : it(_it) {} 3083 public: 3084 3085 ValueIterator() {} 3086 3087 ValueIterator& operator++() { ++it; return *this; } 3088 ValueIterator operator++(int) { 3089 ValueIterator tmp(*this); 3090 operator++(); 3091 return tmp; 3092 } 3093 3094 const Value& operator*() const { return it->first; } 3095 const Value* operator->() const { return &(it->first); } 3096 3097 bool operator==(ValueIterator jt) const { return it == jt.it; } 3098 bool operator!=(ValueIterator jt) const { return it != jt.it; } 3099 3100 private: 3101 typename std::map<Value, Key>::const_iterator it; 3102 }; 3103 3104 /// \brief Returns an iterator to the first value. 3105 /// 3106 /// Returns an stl compatible iterator to the 3107 /// first value of the map. The values of the 3108 /// map can be accessed in the <tt>[beginValue, endValue)</tt> 3109 /// range. 3110 ValueIterator beginValue() const { 3111 return ValueIterator(_first.begin()); 3112 } 3113 3114 /// \brief Returns an iterator after the last value. 3115 /// 3116 /// Returns an stl compatible iterator after the 3117 /// last value of the map. The values of the 3118 /// map can be accessed in the <tt>[beginValue, endValue)</tt> 3119 /// range. 3120 ValueIterator endValue() const { 3121 return ValueIterator(_first.end()); 3122 } 3123 3124 /// \brief Set operation of the map. 3125 /// 3126 /// Set operation of the map. 3127 void set(const Key& key, const Value& value) { 3128 unlace(key); 3129 Parent::operator[](key).value = value; 3130 lace(key); 3131 } 3132 3133 /// \brief Const subscript operator of the map. 3134 /// 3135 /// Const subscript operator of the map. 3136 const Value& operator[](const Key& key) const { 3137 return Parent::operator[](key).value; 3138 } 3139 3140 /// \brief Iterator for the keys with the same value. 3141 /// 3142 /// Iterator for the keys with the same value. It works 3143 /// like a graph item iterator, it can be converted to 3144 /// the item type of the map, incremented with \c ++ operator, and 3145 /// if the iterator leaves the last valid item, it will be equal to 3146 /// \c INVALID. 3147 class ItemIt : public Key { 3148 public: 3149 typedef Key Parent; 3150 3151 /// \brief Invalid constructor \& conversion. 3152 /// 3153 /// This constructor initializes the iterator to be invalid. 3154 /// \sa Invalid for more details. 3155 ItemIt(Invalid) : Parent(INVALID), _map(0) {} 3156 3157 /// \brief Creates an iterator with a value. 3158 /// 3159 /// Creates an iterator with a value. It iterates on the 3160 /// keys which have the given value. 3161 /// \param map The IterableValueMap 3162 /// \param value The value 3163 ItemIt(const IterableValueMap& map, const Value& value) : _map(&map) { 3164 typename std::map<Value, Key>::const_iterator it = 3165 map._first.find(value); 3166 if (it == map._first.end()) { 3167 Parent::operator=(INVALID); 3168 } else { 3169 Parent::operator=(it->second); 3170 } 3171 } 3172 3173 /// \brief Increment operator. 3174 /// 3175 /// Increment Operator. 3176 ItemIt& operator++() { 3177 Parent::operator=(_map->IterableValueMap::Parent:: 3178 operator[](static_cast<Parent&>(*this)).next); 3179 return *this; 3180 } 3181 3182 3183 private: 3184 const IterableValueMap* _map; 3185 }; 3186 3187 protected: 3188 3189 virtual void add(const Key& key) { 3190 Parent::add(key); 3191 unlace(key); 3192 } 3193 3194 virtual void add(const std::vector<Key>& keys) { 3195 Parent::add(keys); 3196 for (int i = 0; i < int(keys.size()); ++i) { 3197 lace(keys[i]); 3198 } 3199 } 3200 3201 virtual void erase(const Key& key) { 3202 unlace(key); 3203 Parent::erase(key); 3204 } 3205 3206 virtual void erase(const std::vector<Key>& keys) { 3207 for (int i = 0; i < int(keys.size()); ++i) { 3208 unlace(keys[i]); 3209 } 3210 Parent::erase(keys); 3211 } 3212 3213 virtual void build() { 3214 Parent::build(); 3215 for (typename Parent::ItemIt it(*this); it != INVALID; ++it) { 3216 lace(it); 3217 } 3218 } 3219 3220 virtual void clear() { 3221 _first.clear(); 3222 Parent::clear(); 3223 } 3224 3225 private: 3226 std::map<Value, Key> _first; 3227 }; 3228 2314 3229 /// \brief Map of the source nodes of arcs in a digraph. 2315 3230 /// … … 2481 3396 /// whenever the digraph changes. 2482 3397 /// 2483 /// \warning Besides \c addNode() and \c addArc(), a digraph structure 3398 /// \warning Besides \c addNode() and \c addArc(), a digraph structure 2484 3399 /// may provide alternative ways to modify the digraph. 2485 3400 /// The correct behavior of InDegMap is not guarantied if these additional … … 2497 3412 2498 3413 public: 2499 3414 2500 3415 /// The graph type of InDegMap 2501 3416 typedef GR Graph; … … 2611 3526 /// whenever the digraph changes. 2612 3527 /// 2613 /// \warning Besides \c addNode() and \c addArc(), a digraph structure 3528 /// \warning Besides \c addNode() and \c addArc(), a digraph structure 2614 3529 /// may provide alternative ways to modify the digraph. 2615 3530 /// The correct behavior of OutDegMap is not guarantied if these additional
Note: See TracChangeset
for help on using the changeset viewer.