| ... | ... |
@@ -3006,403 +3006,403 @@ |
| 3006 | 3006 |
} |
| 3007 | 3007 |
} |
| 3008 | 3008 |
|
| 3009 | 3009 |
void nextOut(Arc& e) const {
|
| 3010 | 3010 |
if (!e._item.firstState()) {
|
| 3011 | 3011 |
e._item.setFirst(INVALID); |
| 3012 | 3012 |
} else {
|
| 3013 | 3013 |
_digraph->nextOut(e._item.first()); |
| 3014 | 3014 |
} |
| 3015 | 3015 |
} |
| 3016 | 3016 |
|
| 3017 | 3017 |
void firstIn(Arc& e, const Node& n) const {
|
| 3018 | 3018 |
if (!n._in) {
|
| 3019 | 3019 |
e._item.setSecond(n); |
| 3020 | 3020 |
} else {
|
| 3021 | 3021 |
e._item.setFirst(); |
| 3022 | 3022 |
_digraph->firstIn(e._item.first(), n); |
| 3023 | 3023 |
} |
| 3024 | 3024 |
} |
| 3025 | 3025 |
|
| 3026 | 3026 |
void nextIn(Arc& e) const {
|
| 3027 | 3027 |
if (!e._item.firstState()) {
|
| 3028 | 3028 |
e._item.setFirst(INVALID); |
| 3029 | 3029 |
} else {
|
| 3030 | 3030 |
_digraph->nextIn(e._item.first()); |
| 3031 | 3031 |
} |
| 3032 | 3032 |
} |
| 3033 | 3033 |
|
| 3034 | 3034 |
Node source(const Arc& e) const {
|
| 3035 | 3035 |
if (e._item.firstState()) {
|
| 3036 | 3036 |
return Node(_digraph->source(e._item.first()), false); |
| 3037 | 3037 |
} else {
|
| 3038 | 3038 |
return Node(e._item.second(), true); |
| 3039 | 3039 |
} |
| 3040 | 3040 |
} |
| 3041 | 3041 |
|
| 3042 | 3042 |
Node target(const Arc& e) const {
|
| 3043 | 3043 |
if (e._item.firstState()) {
|
| 3044 | 3044 |
return Node(_digraph->target(e._item.first()), true); |
| 3045 | 3045 |
} else {
|
| 3046 | 3046 |
return Node(e._item.second(), false); |
| 3047 | 3047 |
} |
| 3048 | 3048 |
} |
| 3049 | 3049 |
|
| 3050 | 3050 |
int id(const Node& n) const {
|
| 3051 | 3051 |
return (_digraph->id(n) << 1) | (n._in ? 0 : 1); |
| 3052 | 3052 |
} |
| 3053 | 3053 |
Node nodeFromId(int ix) const {
|
| 3054 | 3054 |
return Node(_digraph->nodeFromId(ix >> 1), (ix & 1) == 0); |
| 3055 | 3055 |
} |
| 3056 | 3056 |
int maxNodeId() const {
|
| 3057 | 3057 |
return 2 * _digraph->maxNodeId() + 1; |
| 3058 | 3058 |
} |
| 3059 | 3059 |
|
| 3060 | 3060 |
int id(const Arc& e) const {
|
| 3061 | 3061 |
if (e._item.firstState()) {
|
| 3062 | 3062 |
return _digraph->id(e._item.first()) << 1; |
| 3063 | 3063 |
} else {
|
| 3064 | 3064 |
return (_digraph->id(e._item.second()) << 1) | 1; |
| 3065 | 3065 |
} |
| 3066 | 3066 |
} |
| 3067 | 3067 |
Arc arcFromId(int ix) const {
|
| 3068 | 3068 |
if ((ix & 1) == 0) {
|
| 3069 | 3069 |
return Arc(_digraph->arcFromId(ix >> 1)); |
| 3070 | 3070 |
} else {
|
| 3071 | 3071 |
return Arc(_digraph->nodeFromId(ix >> 1)); |
| 3072 | 3072 |
} |
| 3073 | 3073 |
} |
| 3074 | 3074 |
int maxArcId() const {
|
| 3075 | 3075 |
return std::max(_digraph->maxNodeId() << 1, |
| 3076 | 3076 |
(_digraph->maxArcId() << 1) | 1); |
| 3077 | 3077 |
} |
| 3078 | 3078 |
|
| 3079 | 3079 |
static bool inNode(const Node& n) {
|
| 3080 | 3080 |
return n._in; |
| 3081 | 3081 |
} |
| 3082 | 3082 |
|
| 3083 | 3083 |
static bool outNode(const Node& n) {
|
| 3084 | 3084 |
return !n._in; |
| 3085 | 3085 |
} |
| 3086 | 3086 |
|
| 3087 | 3087 |
static bool origArc(const Arc& e) {
|
| 3088 | 3088 |
return e._item.firstState(); |
| 3089 | 3089 |
} |
| 3090 | 3090 |
|
| 3091 | 3091 |
static bool bindArc(const Arc& e) {
|
| 3092 | 3092 |
return e._item.secondState(); |
| 3093 | 3093 |
} |
| 3094 | 3094 |
|
| 3095 | 3095 |
static Node inNode(const DigraphNode& n) {
|
| 3096 | 3096 |
return Node(n, true); |
| 3097 | 3097 |
} |
| 3098 | 3098 |
|
| 3099 | 3099 |
static Node outNode(const DigraphNode& n) {
|
| 3100 | 3100 |
return Node(n, false); |
| 3101 | 3101 |
} |
| 3102 | 3102 |
|
| 3103 | 3103 |
static Arc arc(const DigraphNode& n) {
|
| 3104 | 3104 |
return Arc(n); |
| 3105 | 3105 |
} |
| 3106 | 3106 |
|
| 3107 | 3107 |
static Arc arc(const DigraphArc& e) {
|
| 3108 | 3108 |
return Arc(e); |
| 3109 | 3109 |
} |
| 3110 | 3110 |
|
| 3111 | 3111 |
typedef True NodeNumTag; |
| 3112 | 3112 |
int nodeNum() const {
|
| 3113 | 3113 |
return 2 * countNodes(*_digraph); |
| 3114 | 3114 |
} |
| 3115 | 3115 |
|
| 3116 | 3116 |
typedef True ArcNumTag; |
| 3117 | 3117 |
int arcNum() const {
|
| 3118 | 3118 |
return countArcs(*_digraph) + countNodes(*_digraph); |
| 3119 | 3119 |
} |
| 3120 | 3120 |
|
| 3121 | 3121 |
typedef True FindArcTag; |
| 3122 | 3122 |
Arc findArc(const Node& u, const Node& v, |
| 3123 | 3123 |
const Arc& prev = INVALID) const {
|
| 3124 | 3124 |
if (inNode(u) && outNode(v)) {
|
| 3125 | 3125 |
if (static_cast<const DigraphNode&>(u) == |
| 3126 | 3126 |
static_cast<const DigraphNode&>(v) && prev == INVALID) {
|
| 3127 | 3127 |
return Arc(u); |
| 3128 | 3128 |
} |
| 3129 | 3129 |
} |
| 3130 | 3130 |
else if (outNode(u) && inNode(v)) {
|
| 3131 | 3131 |
return Arc(::lemon::findArc(*_digraph, u, v, prev)); |
| 3132 | 3132 |
} |
| 3133 | 3133 |
return INVALID; |
| 3134 | 3134 |
} |
| 3135 | 3135 |
|
| 3136 | 3136 |
private: |
| 3137 | 3137 |
|
| 3138 | 3138 |
template <typename V> |
| 3139 | 3139 |
class NodeMapBase |
| 3140 | 3140 |
: public MapTraits<typename Parent::template NodeMap<V> > {
|
| 3141 | 3141 |
typedef typename Parent::template NodeMap<V> NodeImpl; |
| 3142 | 3142 |
public: |
| 3143 | 3143 |
typedef Node Key; |
| 3144 | 3144 |
typedef V Value; |
| 3145 | 3145 |
typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag; |
| 3146 | 3146 |
typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue; |
| 3147 | 3147 |
typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue; |
| 3148 | 3148 |
typedef typename MapTraits<NodeImpl>::ReturnValue Reference; |
| 3149 | 3149 |
typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference; |
| 3150 | 3150 |
|
| 3151 | 3151 |
NodeMapBase(const SplitNodesBase<DGR>& adaptor) |
| 3152 | 3152 |
: _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {}
|
| 3153 | 3153 |
NodeMapBase(const SplitNodesBase<DGR>& adaptor, const V& value) |
| 3154 | 3154 |
: _in_map(*adaptor._digraph, value), |
| 3155 | 3155 |
_out_map(*adaptor._digraph, value) {}
|
| 3156 | 3156 |
|
| 3157 | 3157 |
void set(const Node& key, const V& val) {
|
| 3158 | 3158 |
if (SplitNodesBase<DGR>::inNode(key)) { _in_map.set(key, val); }
|
| 3159 | 3159 |
else {_out_map.set(key, val); }
|
| 3160 | 3160 |
} |
| 3161 | 3161 |
|
| 3162 | 3162 |
ReturnValue operator[](const Node& key) {
|
| 3163 | 3163 |
if (SplitNodesBase<DGR>::inNode(key)) { return _in_map[key]; }
|
| 3164 | 3164 |
else { return _out_map[key]; }
|
| 3165 | 3165 |
} |
| 3166 | 3166 |
|
| 3167 | 3167 |
ConstReturnValue operator[](const Node& key) const {
|
| 3168 | 3168 |
if (Adaptor::inNode(key)) { return _in_map[key]; }
|
| 3169 | 3169 |
else { return _out_map[key]; }
|
| 3170 | 3170 |
} |
| 3171 | 3171 |
|
| 3172 | 3172 |
private: |
| 3173 | 3173 |
NodeImpl _in_map, _out_map; |
| 3174 | 3174 |
}; |
| 3175 | 3175 |
|
| 3176 | 3176 |
template <typename V> |
| 3177 | 3177 |
class ArcMapBase |
| 3178 | 3178 |
: public MapTraits<typename Parent::template ArcMap<V> > {
|
| 3179 | 3179 |
typedef typename Parent::template ArcMap<V> ArcImpl; |
| 3180 | 3180 |
typedef typename Parent::template NodeMap<V> NodeImpl; |
| 3181 | 3181 |
public: |
| 3182 | 3182 |
typedef Arc Key; |
| 3183 | 3183 |
typedef V Value; |
| 3184 | 3184 |
typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag; |
| 3185 | 3185 |
typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue; |
| 3186 | 3186 |
typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue; |
| 3187 | 3187 |
typedef typename MapTraits<ArcImpl>::ReturnValue Reference; |
| 3188 | 3188 |
typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference; |
| 3189 | 3189 |
|
| 3190 | 3190 |
ArcMapBase(const SplitNodesBase<DGR>& adaptor) |
| 3191 | 3191 |
: _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {}
|
| 3192 | 3192 |
ArcMapBase(const SplitNodesBase<DGR>& adaptor, const V& value) |
| 3193 | 3193 |
: _arc_map(*adaptor._digraph, value), |
| 3194 | 3194 |
_node_map(*adaptor._digraph, value) {}
|
| 3195 | 3195 |
|
| 3196 | 3196 |
void set(const Arc& key, const V& val) {
|
| 3197 | 3197 |
if (SplitNodesBase<DGR>::origArc(key)) {
|
| 3198 |
_arc_map.set( |
|
| 3198 |
_arc_map.set(static_cast<const DigraphArc&>(key), val); |
|
| 3199 | 3199 |
} else {
|
| 3200 |
_node_map.set( |
|
| 3200 |
_node_map.set(static_cast<const DigraphNode&>(key), val); |
|
| 3201 | 3201 |
} |
| 3202 | 3202 |
} |
| 3203 | 3203 |
|
| 3204 | 3204 |
ReturnValue operator[](const Arc& key) {
|
| 3205 | 3205 |
if (SplitNodesBase<DGR>::origArc(key)) {
|
| 3206 |
return _arc_map[ |
|
| 3206 |
return _arc_map[static_cast<const DigraphArc&>(key)]; |
|
| 3207 | 3207 |
} else {
|
| 3208 |
return _node_map[ |
|
| 3208 |
return _node_map[static_cast<const DigraphNode&>(key)]; |
|
| 3209 | 3209 |
} |
| 3210 | 3210 |
} |
| 3211 | 3211 |
|
| 3212 | 3212 |
ConstReturnValue operator[](const Arc& key) const {
|
| 3213 | 3213 |
if (SplitNodesBase<DGR>::origArc(key)) {
|
| 3214 |
return _arc_map[ |
|
| 3214 |
return _arc_map[static_cast<const DigraphArc&>(key)]; |
|
| 3215 | 3215 |
} else {
|
| 3216 |
return _node_map[ |
|
| 3216 |
return _node_map[static_cast<const DigraphNode&>(key)]; |
|
| 3217 | 3217 |
} |
| 3218 | 3218 |
} |
| 3219 | 3219 |
|
| 3220 | 3220 |
private: |
| 3221 | 3221 |
ArcImpl _arc_map; |
| 3222 | 3222 |
NodeImpl _node_map; |
| 3223 | 3223 |
}; |
| 3224 | 3224 |
|
| 3225 | 3225 |
public: |
| 3226 | 3226 |
|
| 3227 | 3227 |
template <typename V> |
| 3228 | 3228 |
class NodeMap |
| 3229 | 3229 |
: public SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<V> > |
| 3230 | 3230 |
{
|
| 3231 | 3231 |
public: |
| 3232 | 3232 |
typedef V Value; |
| 3233 | 3233 |
typedef SubMapExtender<SplitNodesBase<DGR>, NodeMapBase<Value> > Parent; |
| 3234 | 3234 |
|
| 3235 | 3235 |
NodeMap(const SplitNodesBase<DGR>& adaptor) |
| 3236 | 3236 |
: Parent(adaptor) {}
|
| 3237 | 3237 |
|
| 3238 | 3238 |
NodeMap(const SplitNodesBase<DGR>& adaptor, const V& value) |
| 3239 | 3239 |
: Parent(adaptor, value) {}
|
| 3240 | 3240 |
|
| 3241 | 3241 |
private: |
| 3242 | 3242 |
NodeMap& operator=(const NodeMap& cmap) {
|
| 3243 | 3243 |
return operator=<NodeMap>(cmap); |
| 3244 | 3244 |
} |
| 3245 | 3245 |
|
| 3246 | 3246 |
template <typename CMap> |
| 3247 | 3247 |
NodeMap& operator=(const CMap& cmap) {
|
| 3248 | 3248 |
Parent::operator=(cmap); |
| 3249 | 3249 |
return *this; |
| 3250 | 3250 |
} |
| 3251 | 3251 |
}; |
| 3252 | 3252 |
|
| 3253 | 3253 |
template <typename V> |
| 3254 | 3254 |
class ArcMap |
| 3255 | 3255 |
: public SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<V> > |
| 3256 | 3256 |
{
|
| 3257 | 3257 |
public: |
| 3258 | 3258 |
typedef V Value; |
| 3259 | 3259 |
typedef SubMapExtender<SplitNodesBase<DGR>, ArcMapBase<Value> > Parent; |
| 3260 | 3260 |
|
| 3261 | 3261 |
ArcMap(const SplitNodesBase<DGR>& adaptor) |
| 3262 | 3262 |
: Parent(adaptor) {}
|
| 3263 | 3263 |
|
| 3264 | 3264 |
ArcMap(const SplitNodesBase<DGR>& adaptor, const V& value) |
| 3265 | 3265 |
: Parent(adaptor, value) {}
|
| 3266 | 3266 |
|
| 3267 | 3267 |
private: |
| 3268 | 3268 |
ArcMap& operator=(const ArcMap& cmap) {
|
| 3269 | 3269 |
return operator=<ArcMap>(cmap); |
| 3270 | 3270 |
} |
| 3271 | 3271 |
|
| 3272 | 3272 |
template <typename CMap> |
| 3273 | 3273 |
ArcMap& operator=(const CMap& cmap) {
|
| 3274 | 3274 |
Parent::operator=(cmap); |
| 3275 | 3275 |
return *this; |
| 3276 | 3276 |
} |
| 3277 | 3277 |
}; |
| 3278 | 3278 |
|
| 3279 | 3279 |
protected: |
| 3280 | 3280 |
|
| 3281 | 3281 |
SplitNodesBase() : _digraph(0) {}
|
| 3282 | 3282 |
|
| 3283 | 3283 |
DGR* _digraph; |
| 3284 | 3284 |
|
| 3285 | 3285 |
void initialize(Digraph& digraph) {
|
| 3286 | 3286 |
_digraph = &digraph; |
| 3287 | 3287 |
} |
| 3288 | 3288 |
|
| 3289 | 3289 |
}; |
| 3290 | 3290 |
|
| 3291 | 3291 |
/// \ingroup graph_adaptors |
| 3292 | 3292 |
/// |
| 3293 | 3293 |
/// \brief Adaptor class for splitting the nodes of a digraph. |
| 3294 | 3294 |
/// |
| 3295 | 3295 |
/// SplitNodes adaptor can be used for splitting each node into an |
| 3296 | 3296 |
/// \e in-node and an \e out-node in a digraph. Formaly, the adaptor |
| 3297 | 3297 |
/// replaces each node \f$ u \f$ in the digraph with two nodes, |
| 3298 | 3298 |
/// namely node \f$ u_{in} \f$ and node \f$ u_{out} \f$.
|
| 3299 | 3299 |
/// If there is a \f$ (v, u) \f$ arc in the original digraph, then the |
| 3300 | 3300 |
/// new target of the arc will be \f$ u_{in} \f$ and similarly the
|
| 3301 | 3301 |
/// source of each original \f$ (u, v) \f$ arc will be \f$ u_{out} \f$.
|
| 3302 | 3302 |
/// The adaptor adds an additional \e bind \e arc from \f$ u_{in} \f$
|
| 3303 | 3303 |
/// to \f$ u_{out} \f$ for each node \f$ u \f$ of the original digraph.
|
| 3304 | 3304 |
/// |
| 3305 | 3305 |
/// The aim of this class is running an algorithm with respect to node |
| 3306 | 3306 |
/// costs or capacities if the algorithm considers only arc costs or |
| 3307 | 3307 |
/// capacities directly. |
| 3308 | 3308 |
/// In this case you can use \c SplitNodes adaptor, and set the node |
| 3309 | 3309 |
/// costs/capacities of the original digraph to the \e bind \e arcs |
| 3310 | 3310 |
/// in the adaptor. |
| 3311 | 3311 |
/// |
| 3312 | 3312 |
/// \tparam DGR The type of the adapted digraph. |
| 3313 | 3313 |
/// It must conform to the \ref concepts::Digraph "Digraph" concept. |
| 3314 | 3314 |
/// It is implicitly \c const. |
| 3315 | 3315 |
/// |
| 3316 | 3316 |
/// \note The \c Node type of this adaptor is converible to the \c Node |
| 3317 | 3317 |
/// type of the adapted digraph. |
| 3318 | 3318 |
template <typename DGR> |
| 3319 | 3319 |
#ifdef DOXYGEN |
| 3320 | 3320 |
class SplitNodes {
|
| 3321 | 3321 |
#else |
| 3322 | 3322 |
class SplitNodes |
| 3323 | 3323 |
: public DigraphAdaptorExtender<SplitNodesBase<const DGR> > {
|
| 3324 | 3324 |
#endif |
| 3325 | 3325 |
public: |
| 3326 | 3326 |
typedef DGR Digraph; |
| 3327 | 3327 |
typedef DigraphAdaptorExtender<SplitNodesBase<const DGR> > Parent; |
| 3328 | 3328 |
|
| 3329 | 3329 |
typedef typename DGR::Node DigraphNode; |
| 3330 | 3330 |
typedef typename DGR::Arc DigraphArc; |
| 3331 | 3331 |
|
| 3332 | 3332 |
typedef typename Parent::Node Node; |
| 3333 | 3333 |
typedef typename Parent::Arc Arc; |
| 3334 | 3334 |
|
| 3335 | 3335 |
/// \brief Constructor |
| 3336 | 3336 |
/// |
| 3337 | 3337 |
/// Constructor of the adaptor. |
| 3338 | 3338 |
SplitNodes(const DGR& g) {
|
| 3339 | 3339 |
Parent::initialize(g); |
| 3340 | 3340 |
} |
| 3341 | 3341 |
|
| 3342 | 3342 |
/// \brief Returns \c true if the given node is an in-node. |
| 3343 | 3343 |
/// |
| 3344 | 3344 |
/// Returns \c true if the given node is an in-node. |
| 3345 | 3345 |
static bool inNode(const Node& n) {
|
| 3346 | 3346 |
return Parent::inNode(n); |
| 3347 | 3347 |
} |
| 3348 | 3348 |
|
| 3349 | 3349 |
/// \brief Returns \c true if the given node is an out-node. |
| 3350 | 3350 |
/// |
| 3351 | 3351 |
/// Returns \c true if the given node is an out-node. |
| 3352 | 3352 |
static bool outNode(const Node& n) {
|
| 3353 | 3353 |
return Parent::outNode(n); |
| 3354 | 3354 |
} |
| 3355 | 3355 |
|
| 3356 | 3356 |
/// \brief Returns \c true if the given arc is an original arc. |
| 3357 | 3357 |
/// |
| 3358 | 3358 |
/// Returns \c true if the given arc is one of the arcs in the |
| 3359 | 3359 |
/// original digraph. |
| 3360 | 3360 |
static bool origArc(const Arc& a) {
|
| 3361 | 3361 |
return Parent::origArc(a); |
| 3362 | 3362 |
} |
| 3363 | 3363 |
|
| 3364 | 3364 |
/// \brief Returns \c true if the given arc is a bind arc. |
| 3365 | 3365 |
/// |
| 3366 | 3366 |
/// Returns \c true if the given arc is a bind arc, i.e. it connects |
| 3367 | 3367 |
/// an in-node and an out-node. |
| 3368 | 3368 |
static bool bindArc(const Arc& a) {
|
| 3369 | 3369 |
return Parent::bindArc(a); |
| 3370 | 3370 |
} |
| 3371 | 3371 |
|
| 3372 | 3372 |
/// \brief Returns the in-node created from the given original node. |
| 3373 | 3373 |
/// |
| 3374 | 3374 |
/// Returns the in-node created from the given original node. |
| 3375 | 3375 |
static Node inNode(const DigraphNode& n) {
|
| 3376 | 3376 |
return Parent::inNode(n); |
| 3377 | 3377 |
} |
| 3378 | 3378 |
|
| 3379 | 3379 |
/// \brief Returns the out-node created from the given original node. |
| 3380 | 3380 |
/// |
| 3381 | 3381 |
/// Returns the out-node created from the given original node. |
| 3382 | 3382 |
static Node outNode(const DigraphNode& n) {
|
| 3383 | 3383 |
return Parent::outNode(n); |
| 3384 | 3384 |
} |
| 3385 | 3385 |
|
| 3386 | 3386 |
/// \brief Returns the bind arc that corresponds to the given |
| 3387 | 3387 |
/// original node. |
| 3388 | 3388 |
/// |
| 3389 | 3389 |
/// Returns the bind arc in the adaptor that corresponds to the given |
| 3390 | 3390 |
/// original node, i.e. the arc connecting the in-node and out-node |
| 3391 | 3391 |
/// of \c n. |
| 3392 | 3392 |
static Arc arc(const DigraphNode& n) {
|
| 3393 | 3393 |
return Parent::arc(n); |
| 3394 | 3394 |
} |
| 3395 | 3395 |
|
| 3396 | 3396 |
/// \brief Returns the arc that corresponds to the given original arc. |
| 3397 | 3397 |
/// |
| 3398 | 3398 |
/// Returns the arc in the adaptor that corresponds to the given |
| 3399 | 3399 |
/// original arc. |
| 3400 | 3400 |
static Arc arc(const DigraphArc& a) {
|
| 3401 | 3401 |
return Parent::arc(a); |
| 3402 | 3402 |
} |
| 3403 | 3403 |
|
| 3404 | 3404 |
/// \brief Node map combined from two original node maps |
| 3405 | 3405 |
/// |
| 3406 | 3406 |
/// This map adaptor class adapts two node maps of the original digraph |
| 3407 | 3407 |
/// to get a node map of the split digraph. |
| 3408 | 3408 |
/// Its value type is inherited from the first node map type |
0 comments (0 inline)