| ... | ... |
@@ -53,59 +53,59 @@ |
| 53 | 53 |
|
| 54 | 54 |
typedef typename Digraph::Node Node; |
| 55 | 55 |
typedef typename Digraph::Arc Arc; |
| 56 | 56 |
|
| 57 | 57 |
void first(Node& i) const { _digraph->first(i); }
|
| 58 | 58 |
void first(Arc& i) const { _digraph->first(i); }
|
| 59 | 59 |
void firstIn(Arc& i, const Node& n) const { _digraph->firstIn(i, n); }
|
| 60 | 60 |
void firstOut(Arc& i, const Node& n ) const { _digraph->firstOut(i, n); }
|
| 61 | 61 |
|
| 62 | 62 |
void next(Node& i) const { _digraph->next(i); }
|
| 63 | 63 |
void next(Arc& i) const { _digraph->next(i); }
|
| 64 | 64 |
void nextIn(Arc& i) const { _digraph->nextIn(i); }
|
| 65 | 65 |
void nextOut(Arc& i) const { _digraph->nextOut(i); }
|
| 66 | 66 |
|
| 67 | 67 |
Node source(const Arc& a) const { return _digraph->source(a); }
|
| 68 | 68 |
Node target(const Arc& a) const { return _digraph->target(a); }
|
| 69 | 69 |
|
| 70 | 70 |
typedef NodeNumTagIndicator<Digraph> NodeNumTag; |
| 71 | 71 |
int nodeNum() const { return _digraph->nodeNum(); }
|
| 72 | 72 |
|
| 73 | 73 |
typedef ArcNumTagIndicator<Digraph> ArcNumTag; |
| 74 | 74 |
int arcNum() const { return _digraph->arcNum(); }
|
| 75 | 75 |
|
| 76 | 76 |
typedef FindArcTagIndicator<Digraph> FindArcTag; |
| 77 |
Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) {
|
|
| 77 |
Arc findArc(const Node& u, const Node& v, const Arc& prev = INVALID) const {
|
|
| 78 | 78 |
return _digraph->findArc(u, v, prev); |
| 79 | 79 |
} |
| 80 | 80 |
|
| 81 | 81 |
Node addNode() { return _digraph->addNode(); }
|
| 82 | 82 |
Arc addArc(const Node& u, const Node& v) { return _digraph->addArc(u, v); }
|
| 83 | 83 |
|
| 84 |
void erase(const Node& n) const { _digraph->erase(n); }
|
|
| 85 |
void erase(const Arc& a) const { _digraph->erase(a); }
|
|
| 86 |
|
|
| 87 |
void clear() const { _digraph->clear(); }
|
|
| 84 |
void erase(const Node& n) { _digraph->erase(n); }
|
|
| 85 |
void erase(const Arc& a) { _digraph->erase(a); }
|
|
| 86 |
|
|
| 87 |
void clear() { _digraph->clear(); }
|
|
| 88 | 88 |
|
| 89 | 89 |
int id(const Node& n) const { return _digraph->id(n); }
|
| 90 | 90 |
int id(const Arc& a) const { return _digraph->id(a); }
|
| 91 | 91 |
|
| 92 | 92 |
Node nodeFromId(int ix) const { return _digraph->nodeFromId(ix); }
|
| 93 | 93 |
Arc arcFromId(int ix) const { return _digraph->arcFromId(ix); }
|
| 94 | 94 |
|
| 95 | 95 |
int maxNodeId() const { return _digraph->maxNodeId(); }
|
| 96 | 96 |
int maxArcId() const { return _digraph->maxArcId(); }
|
| 97 | 97 |
|
| 98 | 98 |
typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier; |
| 99 | 99 |
NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); }
|
| 100 | 100 |
|
| 101 | 101 |
typedef typename ItemSetTraits<Digraph, Arc>::ItemNotifier ArcNotifier; |
| 102 | 102 |
ArcNotifier& notifier(Arc) const { return _digraph->notifier(Arc()); }
|
| 103 | 103 |
|
| 104 | 104 |
template <typename _Value> |
| 105 | 105 |
class NodeMap : public Digraph::template NodeMap<_Value> {
|
| 106 | 106 |
public: |
| 107 | 107 |
|
| 108 | 108 |
typedef typename Digraph::template NodeMap<_Value> Parent; |
| 109 | 109 |
|
| 110 | 110 |
explicit NodeMap(const Adaptor& adaptor) |
| 111 | 111 |
: Parent(*adaptor._digraph) {}
|
| ... | ... |
@@ -184,54 +184,56 @@ |
| 184 | 184 |
|
| 185 | 185 |
void next(Node& i) const { _graph->next(i); }
|
| 186 | 186 |
void next(Arc& i) const { _graph->next(i); }
|
| 187 | 187 |
void next(Edge& i) const { _graph->next(i); }
|
| 188 | 188 |
void nextIn(Arc& i) const { _graph->nextIn(i); }
|
| 189 | 189 |
void nextOut(Arc& i) const { _graph->nextOut(i); }
|
| 190 | 190 |
void nextInc(Edge &i, bool &d) const { _graph->nextInc(i, d); }
|
| 191 | 191 |
|
| 192 | 192 |
Node u(const Edge& e) const { return _graph->u(e); }
|
| 193 | 193 |
Node v(const Edge& e) const { return _graph->v(e); }
|
| 194 | 194 |
|
| 195 | 195 |
Node source(const Arc& a) const { return _graph->source(a); }
|
| 196 | 196 |
Node target(const Arc& a) const { return _graph->target(a); }
|
| 197 | 197 |
|
| 198 | 198 |
typedef NodeNumTagIndicator<Graph> NodeNumTag; |
| 199 | 199 |
int nodeNum() const { return _graph->nodeNum(); }
|
| 200 | 200 |
|
| 201 | 201 |
typedef ArcNumTagIndicator<Graph> ArcNumTag; |
| 202 | 202 |
int arcNum() const { return _graph->arcNum(); }
|
| 203 | 203 |
|
| 204 | 204 |
typedef EdgeNumTagIndicator<Graph> EdgeNumTag; |
| 205 | 205 |
int edgeNum() const { return _graph->edgeNum(); }
|
| 206 | 206 |
|
| 207 | 207 |
typedef FindArcTagIndicator<Graph> FindArcTag; |
| 208 |
Arc findArc(const Node& u, const Node& v, |
|
| 208 |
Arc findArc(const Node& u, const Node& v, |
|
| 209 |
const Arc& prev = INVALID) const {
|
|
| 209 | 210 |
return _graph->findArc(u, v, prev); |
| 210 | 211 |
} |
| 211 | 212 |
|
| 212 | 213 |
typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
| 213 |
Edge findEdge(const Node& u, const Node& v, |
|
| 214 |
Edge findEdge(const Node& u, const Node& v, |
|
| 215 |
const Edge& prev = INVALID) const {
|
|
| 214 | 216 |
return _graph->findEdge(u, v, prev); |
| 215 | 217 |
} |
| 216 | 218 |
|
| 217 | 219 |
Node addNode() { return _graph->addNode(); }
|
| 218 | 220 |
Edge addEdge(const Node& u, const Node& v) { return _graph->addEdge(u, v); }
|
| 219 | 221 |
|
| 220 | 222 |
void erase(const Node& i) { _graph->erase(i); }
|
| 221 | 223 |
void erase(const Edge& i) { _graph->erase(i); }
|
| 222 | 224 |
|
| 223 | 225 |
void clear() { _graph->clear(); }
|
| 224 | 226 |
|
| 225 | 227 |
bool direction(const Arc& a) const { return _graph->direction(a); }
|
| 226 | 228 |
Arc direct(const Edge& e, bool d) const { return _graph->direct(e, d); }
|
| 227 | 229 |
|
| 228 | 230 |
int id(const Node& v) const { return _graph->id(v); }
|
| 229 | 231 |
int id(const Arc& a) const { return _graph->id(a); }
|
| 230 | 232 |
int id(const Edge& e) const { return _graph->id(e); }
|
| 231 | 233 |
|
| 232 | 234 |
Node nodeFromId(int ix) const { return _graph->nodeFromId(ix); }
|
| 233 | 235 |
Arc arcFromId(int ix) const { return _graph->arcFromId(ix); }
|
| 234 | 236 |
Edge edgeFromId(int ix) const { return _graph->edgeFromId(ix); }
|
| 235 | 237 |
|
| 236 | 238 |
int maxNodeId() const { return _graph->maxNodeId(); }
|
| 237 | 239 |
int maxArcId() const { return _graph->maxArcId(); }
|
| ... | ... |
@@ -315,49 +317,49 @@ |
| 315 | 317 |
template <typename _Digraph> |
| 316 | 318 |
class ReverseDigraphBase : public DigraphAdaptorBase<_Digraph> {
|
| 317 | 319 |
public: |
| 318 | 320 |
typedef _Digraph Digraph; |
| 319 | 321 |
typedef DigraphAdaptorBase<_Digraph> Parent; |
| 320 | 322 |
protected: |
| 321 | 323 |
ReverseDigraphBase() : Parent() { }
|
| 322 | 324 |
public: |
| 323 | 325 |
typedef typename Parent::Node Node; |
| 324 | 326 |
typedef typename Parent::Arc Arc; |
| 325 | 327 |
|
| 326 | 328 |
void firstIn(Arc& a, const Node& n) const { Parent::firstOut(a, n); }
|
| 327 | 329 |
void firstOut(Arc& a, const Node& n ) const { Parent::firstIn(a, n); }
|
| 328 | 330 |
|
| 329 | 331 |
void nextIn(Arc& a) const { Parent::nextOut(a); }
|
| 330 | 332 |
void nextOut(Arc& a) const { Parent::nextIn(a); }
|
| 331 | 333 |
|
| 332 | 334 |
Node source(const Arc& a) const { return Parent::target(a); }
|
| 333 | 335 |
Node target(const Arc& a) const { return Parent::source(a); }
|
| 334 | 336 |
|
| 335 | 337 |
Arc addArc(const Node& u, const Node& v) { return Parent::addArc(v, u); }
|
| 336 | 338 |
|
| 337 | 339 |
typedef FindArcTagIndicator<Digraph> FindArcTag; |
| 338 | 340 |
Arc findArc(const Node& u, const Node& v, |
| 339 |
const Arc& prev = INVALID) {
|
|
| 341 |
const Arc& prev = INVALID) const {
|
|
| 340 | 342 |
return Parent::findArc(v, u, prev); |
| 341 | 343 |
} |
| 342 | 344 |
|
| 343 | 345 |
}; |
| 344 | 346 |
|
| 345 | 347 |
/// \ingroup graph_adaptors |
| 346 | 348 |
/// |
| 347 | 349 |
/// \brief A digraph adaptor which reverses the orientation of the arcs. |
| 348 | 350 |
/// |
| 349 | 351 |
/// ReverseDigraph reverses the arcs in the adapted digraph. The |
| 350 | 352 |
/// SubDigraph is conform to the \ref concepts::Digraph |
| 351 | 353 |
/// "Digraph concept". |
| 352 | 354 |
/// |
| 353 | 355 |
/// \tparam _Digraph It must be conform to the \ref concepts::Digraph |
| 354 | 356 |
/// "Digraph concept". The type can be specified to be const. |
| 355 | 357 |
template<typename _Digraph> |
| 356 | 358 |
class ReverseDigraph : |
| 357 | 359 |
public DigraphAdaptorExtender<ReverseDigraphBase<_Digraph> > {
|
| 358 | 360 |
public: |
| 359 | 361 |
typedef _Digraph Digraph; |
| 360 | 362 |
typedef DigraphAdaptorExtender< |
| 361 | 363 |
ReverseDigraphBase<_Digraph> > Parent; |
| 362 | 364 |
protected: |
| 363 | 365 |
ReverseDigraph() { }
|
| ... | ... |
@@ -454,49 +456,49 @@ |
| 454 | 456 |
Parent::nextIn(i); |
| 455 | 457 |
} |
| 456 | 458 |
|
| 457 | 459 |
void nextOut(Arc& i) const {
|
| 458 | 460 |
Parent::nextOut(i); |
| 459 | 461 |
while (i != INVALID && (!(*_arc_filter)[i] |
| 460 | 462 |
|| !(*_node_filter)[Parent::target(i)])) |
| 461 | 463 |
Parent::nextOut(i); |
| 462 | 464 |
} |
| 463 | 465 |
|
| 464 | 466 |
void hide(const Node& n) const { _node_filter->set(n, false); }
|
| 465 | 467 |
void hide(const Arc& a) const { _arc_filter->set(a, false); }
|
| 466 | 468 |
|
| 467 | 469 |
void unHide(const Node& n) const { _node_filter->set(n, true); }
|
| 468 | 470 |
void unHide(const Arc& a) const { _arc_filter->set(a, true); }
|
| 469 | 471 |
|
| 470 | 472 |
bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
|
| 471 | 473 |
bool hidden(const Arc& a) const { return !(*_arc_filter)[a]; }
|
| 472 | 474 |
|
| 473 | 475 |
typedef False NodeNumTag; |
| 474 | 476 |
typedef False ArcNumTag; |
| 475 | 477 |
|
| 476 | 478 |
typedef FindArcTagIndicator<Digraph> FindArcTag; |
| 477 | 479 |
Arc findArc(const Node& source, const Node& target, |
| 478 |
const Arc& prev = INVALID) {
|
|
| 480 |
const Arc& prev = INVALID) const {
|
|
| 479 | 481 |
if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
|
| 480 | 482 |
return INVALID; |
| 481 | 483 |
} |
| 482 | 484 |
Arc arc = Parent::findArc(source, target, prev); |
| 483 | 485 |
while (arc != INVALID && !(*_arc_filter)[arc]) {
|
| 484 | 486 |
arc = Parent::findArc(source, target, arc); |
| 485 | 487 |
} |
| 486 | 488 |
return arc; |
| 487 | 489 |
} |
| 488 | 490 |
|
| 489 | 491 |
template <typename _Value> |
| 490 | 492 |
class NodeMap : public SubMapExtender<Adaptor, |
| 491 | 493 |
typename Parent::template NodeMap<_Value> > {
|
| 492 | 494 |
public: |
| 493 | 495 |
typedef _Value Value; |
| 494 | 496 |
typedef SubMapExtender<Adaptor, typename Parent:: |
| 495 | 497 |
template NodeMap<Value> > MapParent; |
| 496 | 498 |
|
| 497 | 499 |
NodeMap(const Adaptor& adaptor) |
| 498 | 500 |
: MapParent(adaptor) {}
|
| 499 | 501 |
NodeMap(const Adaptor& adaptor, const Value& value) |
| 500 | 502 |
: MapParent(adaptor, value) {}
|
| 501 | 503 |
|
| 502 | 504 |
private: |
| ... | ... |
@@ -597,49 +599,49 @@ |
| 597 | 599 |
void nextIn(Arc& i) const {
|
| 598 | 600 |
Parent::nextIn(i); |
| 599 | 601 |
while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextIn(i); |
| 600 | 602 |
} |
| 601 | 603 |
|
| 602 | 604 |
void nextOut(Arc& i) const {
|
| 603 | 605 |
Parent::nextOut(i); |
| 604 | 606 |
while (i!=INVALID && !(*_arc_filter)[i]) Parent::nextOut(i); |
| 605 | 607 |
} |
| 606 | 608 |
|
| 607 | 609 |
void hide(const Node& n) const { _node_filter->set(n, false); }
|
| 608 | 610 |
void hide(const Arc& e) const { _arc_filter->set(e, false); }
|
| 609 | 611 |
|
| 610 | 612 |
void unHide(const Node& n) const { _node_filter->set(n, true); }
|
| 611 | 613 |
void unHide(const Arc& e) const { _arc_filter->set(e, true); }
|
| 612 | 614 |
|
| 613 | 615 |
bool hidden(const Node& n) const { return !(*_node_filter)[n]; }
|
| 614 | 616 |
bool hidden(const Arc& e) const { return !(*_arc_filter)[e]; }
|
| 615 | 617 |
|
| 616 | 618 |
typedef False NodeNumTag; |
| 617 | 619 |
typedef False ArcNumTag; |
| 618 | 620 |
|
| 619 | 621 |
typedef FindArcTagIndicator<Digraph> FindArcTag; |
| 620 | 622 |
Arc findArc(const Node& source, const Node& target, |
| 621 |
const Arc& prev = INVALID) {
|
|
| 623 |
const Arc& prev = INVALID) const {
|
|
| 622 | 624 |
if (!(*_node_filter)[source] || !(*_node_filter)[target]) {
|
| 623 | 625 |
return INVALID; |
| 624 | 626 |
} |
| 625 | 627 |
Arc arc = Parent::findArc(source, target, prev); |
| 626 | 628 |
while (arc != INVALID && !(*_arc_filter)[arc]) {
|
| 627 | 629 |
arc = Parent::findArc(source, target, arc); |
| 628 | 630 |
} |
| 629 | 631 |
return arc; |
| 630 | 632 |
} |
| 631 | 633 |
|
| 632 | 634 |
template <typename _Value> |
| 633 | 635 |
class NodeMap : public SubMapExtender<Adaptor, |
| 634 | 636 |
typename Parent::template NodeMap<_Value> > {
|
| 635 | 637 |
public: |
| 636 | 638 |
typedef _Value Value; |
| 637 | 639 |
typedef SubMapExtender<Adaptor, typename Parent:: |
| 638 | 640 |
template NodeMap<Value> > MapParent; |
| 639 | 641 |
|
| 640 | 642 |
NodeMap(const Adaptor& adaptor) |
| 641 | 643 |
: MapParent(adaptor) {}
|
| 642 | 644 |
NodeMap(const Adaptor& adaptor, const Value& value) |
| 643 | 645 |
: MapParent(adaptor, value) {}
|
| 644 | 646 |
|
| 645 | 647 |
private: |
| ... | ... |
@@ -923,62 +925,62 @@ |
| 923 | 925 |
|
| 924 | 926 |
void nextInc(Edge& i, bool& d) const {
|
| 925 | 927 |
Parent::nextInc(i, d); |
| 926 | 928 |
while (i!=INVALID && (!(*_edge_filter_map)[i] |
| 927 | 929 |
|| !(*_node_filter_map)[Parent::u(i)] |
| 928 | 930 |
|| !(*_node_filter_map)[Parent::v(i)])) |
| 929 | 931 |
Parent::nextInc(i, d); |
| 930 | 932 |
} |
| 931 | 933 |
|
| 932 | 934 |
void hide(const Node& n) const { _node_filter_map->set(n, false); }
|
| 933 | 935 |
void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
|
| 934 | 936 |
|
| 935 | 937 |
void unHide(const Node& n) const { _node_filter_map->set(n, true); }
|
| 936 | 938 |
void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
|
| 937 | 939 |
|
| 938 | 940 |
bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
|
| 939 | 941 |
bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
|
| 940 | 942 |
|
| 941 | 943 |
typedef False NodeNumTag; |
| 942 | 944 |
typedef False ArcNumTag; |
| 943 | 945 |
typedef False EdgeNumTag; |
| 944 | 946 |
|
| 945 | 947 |
typedef FindArcTagIndicator<Graph> FindArcTag; |
| 946 | 948 |
Arc findArc(const Node& u, const Node& v, |
| 947 |
const Arc& prev = INVALID) {
|
|
| 949 |
const Arc& prev = INVALID) const {
|
|
| 948 | 950 |
if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
|
| 949 | 951 |
return INVALID; |
| 950 | 952 |
} |
| 951 | 953 |
Arc arc = Parent::findArc(u, v, prev); |
| 952 | 954 |
while (arc != INVALID && !(*_edge_filter_map)[arc]) {
|
| 953 | 955 |
arc = Parent::findArc(u, v, arc); |
| 954 | 956 |
} |
| 955 | 957 |
return arc; |
| 956 | 958 |
} |
| 957 | 959 |
|
| 958 | 960 |
typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
| 959 | 961 |
Edge findEdge(const Node& u, const Node& v, |
| 960 |
const Edge& prev = INVALID) {
|
|
| 962 |
const Edge& prev = INVALID) const {
|
|
| 961 | 963 |
if (!(*_node_filter_map)[u] || !(*_node_filter_map)[v]) {
|
| 962 | 964 |
return INVALID; |
| 963 | 965 |
} |
| 964 | 966 |
Edge edge = Parent::findEdge(u, v, prev); |
| 965 | 967 |
while (edge != INVALID && !(*_edge_filter_map)[edge]) {
|
| 966 | 968 |
edge = Parent::findEdge(u, v, edge); |
| 967 | 969 |
} |
| 968 | 970 |
return edge; |
| 969 | 971 |
} |
| 970 | 972 |
|
| 971 | 973 |
template <typename _Value> |
| 972 | 974 |
class NodeMap : public SubMapExtender<Adaptor, |
| 973 | 975 |
typename Parent::template NodeMap<_Value> > {
|
| 974 | 976 |
public: |
| 975 | 977 |
typedef _Value Value; |
| 976 | 978 |
typedef SubMapExtender<Adaptor, typename Parent:: |
| 977 | 979 |
template NodeMap<Value> > MapParent; |
| 978 | 980 |
|
| 979 | 981 |
NodeMap(const Adaptor& adaptor) |
| 980 | 982 |
: MapParent(adaptor) {}
|
| 981 | 983 |
NodeMap(const Adaptor& adaptor, const Value& value) |
| 982 | 984 |
: MapParent(adaptor, value) {}
|
| 983 | 985 |
|
| 984 | 986 |
private: |
| ... | ... |
@@ -1122,59 +1124,59 @@ |
| 1122 | 1124 |
void nextOut(Arc& i) const {
|
| 1123 | 1125 |
Parent::nextOut(i); |
| 1124 | 1126 |
while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextOut(i); |
| 1125 | 1127 |
} |
| 1126 | 1128 |
void nextInc(Edge& i, bool& d) const {
|
| 1127 | 1129 |
Parent::nextInc(i, d); |
| 1128 | 1130 |
while (i!=INVALID && !(*_edge_filter_map)[i]) Parent::nextInc(i, d); |
| 1129 | 1131 |
} |
| 1130 | 1132 |
|
| 1131 | 1133 |
void hide(const Node& n) const { _node_filter_map->set(n, false); }
|
| 1132 | 1134 |
void hide(const Edge& e) const { _edge_filter_map->set(e, false); }
|
| 1133 | 1135 |
|
| 1134 | 1136 |
void unHide(const Node& n) const { _node_filter_map->set(n, true); }
|
| 1135 | 1137 |
void unHide(const Edge& e) const { _edge_filter_map->set(e, true); }
|
| 1136 | 1138 |
|
| 1137 | 1139 |
bool hidden(const Node& n) const { return !(*_node_filter_map)[n]; }
|
| 1138 | 1140 |
bool hidden(const Edge& e) const { return !(*_edge_filter_map)[e]; }
|
| 1139 | 1141 |
|
| 1140 | 1142 |
typedef False NodeNumTag; |
| 1141 | 1143 |
typedef False ArcNumTag; |
| 1142 | 1144 |
typedef False EdgeNumTag; |
| 1143 | 1145 |
|
| 1144 | 1146 |
typedef FindArcTagIndicator<Graph> FindArcTag; |
| 1145 | 1147 |
Arc findArc(const Node& u, const Node& v, |
| 1146 |
const Arc& prev = INVALID) {
|
|
| 1148 |
const Arc& prev = INVALID) const {
|
|
| 1147 | 1149 |
Arc arc = Parent::findArc(u, v, prev); |
| 1148 | 1150 |
while (arc != INVALID && !(*_edge_filter_map)[arc]) {
|
| 1149 | 1151 |
arc = Parent::findArc(u, v, arc); |
| 1150 | 1152 |
} |
| 1151 | 1153 |
return arc; |
| 1152 | 1154 |
} |
| 1153 | 1155 |
|
| 1154 | 1156 |
typedef FindEdgeTagIndicator<Graph> FindEdgeTag; |
| 1155 | 1157 |
Edge findEdge(const Node& u, const Node& v, |
| 1156 |
const Edge& prev = INVALID) {
|
|
| 1158 |
const Edge& prev = INVALID) const {
|
|
| 1157 | 1159 |
Edge edge = Parent::findEdge(u, v, prev); |
| 1158 | 1160 |
while (edge != INVALID && !(*_edge_filter_map)[edge]) {
|
| 1159 | 1161 |
edge = Parent::findEdge(u, v, edge); |
| 1160 | 1162 |
} |
| 1161 | 1163 |
return edge; |
| 1162 | 1164 |
} |
| 1163 | 1165 |
|
| 1164 | 1166 |
template <typename _Value> |
| 1165 | 1167 |
class NodeMap : public SubMapExtender<Adaptor, |
| 1166 | 1168 |
typename Parent::template NodeMap<_Value> > {
|
| 1167 | 1169 |
public: |
| 1168 | 1170 |
typedef _Value Value; |
| 1169 | 1171 |
typedef SubMapExtender<Adaptor, typename Parent:: |
| 1170 | 1172 |
template NodeMap<Value> > MapParent; |
| 1171 | 1173 |
|
| 1172 | 1174 |
NodeMap(const Adaptor& adaptor) |
| 1173 | 1175 |
: MapParent(adaptor) {}
|
| 1174 | 1176 |
NodeMap(const Adaptor& adaptor, const Value& value) |
| 1175 | 1177 |
: MapParent(adaptor, value) {}
|
| 1176 | 1178 |
|
| 1177 | 1179 |
private: |
| 1178 | 1180 |
NodeMap& operator=(const NodeMap& cmap) {
|
| 1179 | 1181 |
return operator=<NodeMap>(cmap); |
| 1180 | 1182 |
} |
| ... | ... |
@@ -2222,49 +2224,49 @@ |
| 2222 | 2224 |
_graph->nextInc(i, d); |
| 2223 | 2225 |
while (i != INVALID && d == (*_direction)[i]) _graph->nextInc(i, d); |
| 2224 | 2226 |
} |
| 2225 | 2227 |
void nextOut(Arc& i) const {
|
| 2226 | 2228 |
bool d = (*_direction)[i]; |
| 2227 | 2229 |
_graph->nextInc(i, d); |
| 2228 | 2230 |
while (i != INVALID && d != (*_direction)[i]) _graph->nextInc(i, d); |
| 2229 | 2231 |
} |
| 2230 | 2232 |
|
| 2231 | 2233 |
Node source(const Arc& e) const {
|
| 2232 | 2234 |
return (*_direction)[e] ? _graph->u(e) : _graph->v(e); |
| 2233 | 2235 |
} |
| 2234 | 2236 |
Node target(const Arc& e) const {
|
| 2235 | 2237 |
return (*_direction)[e] ? _graph->v(e) : _graph->u(e); |
| 2236 | 2238 |
} |
| 2237 | 2239 |
|
| 2238 | 2240 |
typedef NodeNumTagIndicator<Graph> NodeNumTag; |
| 2239 | 2241 |
int nodeNum() const { return _graph->nodeNum(); }
|
| 2240 | 2242 |
|
| 2241 | 2243 |
typedef EdgeNumTagIndicator<Graph> ArcNumTag; |
| 2242 | 2244 |
int arcNum() const { return _graph->edgeNum(); }
|
| 2243 | 2245 |
|
| 2244 | 2246 |
typedef FindEdgeTagIndicator<Graph> FindArcTag; |
| 2245 | 2247 |
Arc findArc(const Node& u, const Node& v, |
| 2246 |
const Arc& prev = INVALID) {
|
|
| 2248 |
const Arc& prev = INVALID) const {
|
|
| 2247 | 2249 |
Arc arc = prev; |
| 2248 | 2250 |
bool d = arc == INVALID ? true : (*_direction)[arc]; |
| 2249 | 2251 |
if (d) {
|
| 2250 | 2252 |
arc = _graph->findEdge(u, v, arc); |
| 2251 | 2253 |
while (arc != INVALID && !(*_direction)[arc]) {
|
| 2252 | 2254 |
_graph->findEdge(u, v, arc); |
| 2253 | 2255 |
} |
| 2254 | 2256 |
if (arc != INVALID) return arc; |
| 2255 | 2257 |
} |
| 2256 | 2258 |
_graph->findEdge(v, u, arc); |
| 2257 | 2259 |
while (arc != INVALID && (*_direction)[arc]) {
|
| 2258 | 2260 |
_graph->findEdge(u, v, arc); |
| 2259 | 2261 |
} |
| 2260 | 2262 |
return arc; |
| 2261 | 2263 |
} |
| 2262 | 2264 |
|
| 2263 | 2265 |
Node addNode() {
|
| 2264 | 2266 |
return Node(_graph->addNode()); |
| 2265 | 2267 |
} |
| 2266 | 2268 |
|
| 2267 | 2269 |
Arc addArc(const Node& u, const Node& v) {
|
| 2268 | 2270 |
Arc arc = _graph->addArc(u, v); |
| 2269 | 2271 |
_direction->set(arc, _graph->source(arc) == u); |
| 2270 | 2272 |
return arc; |
| ... | ... |
@@ -3076,63 +3078,63 @@ |
| 3076 | 3078 |
|
| 3077 | 3079 |
/// \ingroup graph_adaptors |
| 3078 | 3080 |
/// |
| 3079 | 3081 |
/// \brief Split the nodes of a directed graph |
| 3080 | 3082 |
/// |
| 3081 | 3083 |
/// The SplitNodes adaptor splits each node into an in-node and an |
| 3082 | 3084 |
/// out-node. Formaly, the adaptor replaces each \f$ u \f$ node in |
| 3083 | 3085 |
/// the digraph with two nodes(namely node \f$ u_{in} \f$ and node
|
| 3084 | 3086 |
/// \f$ u_{out} \f$). If there is a \f$ (v, u) \f$ arc in the
|
| 3085 | 3087 |
/// original digraph the new target of the arc will be \f$ u_{in} \f$
|
| 3086 | 3088 |
/// and similarly the source of the original \f$ (u, v) \f$ arc |
| 3087 | 3089 |
/// will be \f$ u_{out} \f$. The adaptor will add for each node in
|
| 3088 | 3090 |
/// the original digraph an additional arc which connects |
| 3089 | 3091 |
/// \f$ (u_{in}, u_{out}) \f$.
|
| 3090 | 3092 |
/// |
| 3091 | 3093 |
/// The aim of this class is to run algorithm with node costs if the |
| 3092 | 3094 |
/// algorithm can use directly just arc costs. In this case we should use |
| 3093 | 3095 |
/// a \c SplitNodes and set the node cost of the graph to the |
| 3094 | 3096 |
/// bind arc in the adapted graph. |
| 3095 | 3097 |
/// |
| 3096 | 3098 |
/// \tparam _Digraph It must be conform to the \ref concepts::Digraph |
| 3097 | 3099 |
/// "Digraph concept". The type can be specified to be const. |
| 3098 | 3100 |
template <typename _Digraph> |
| 3099 | 3101 |
class SplitNodes |
| 3100 |
: public DigraphAdaptorExtender<SplitNodesBase<_Digraph> > {
|
|
| 3102 |
: public DigraphAdaptorExtender<SplitNodesBase<const _Digraph> > {
|
|
| 3101 | 3103 |
public: |
| 3102 | 3104 |
typedef _Digraph Digraph; |
| 3103 |
typedef DigraphAdaptorExtender<SplitNodesBase<Digraph> > Parent; |
|
| 3105 |
typedef DigraphAdaptorExtender<SplitNodesBase<const Digraph> > Parent; |
|
| 3104 | 3106 |
|
| 3105 | 3107 |
typedef typename Digraph::Node DigraphNode; |
| 3106 | 3108 |
typedef typename Digraph::Arc DigraphArc; |
| 3107 | 3109 |
|
| 3108 | 3110 |
typedef typename Parent::Node Node; |
| 3109 | 3111 |
typedef typename Parent::Arc Arc; |
| 3110 | 3112 |
|
| 3111 | 3113 |
/// \brief Constructor of the adaptor. |
| 3112 | 3114 |
/// |
| 3113 | 3115 |
/// Constructor of the adaptor. |
| 3114 |
SplitNodes(Digraph& g) {
|
|
| 3116 |
SplitNodes(const Digraph& g) {
|
|
| 3115 | 3117 |
Parent::setDigraph(g); |
| 3116 | 3118 |
} |
| 3117 | 3119 |
|
| 3118 | 3120 |
/// \brief Returns true when the node is in-node. |
| 3119 | 3121 |
/// |
| 3120 | 3122 |
/// Returns true when the node is in-node. |
| 3121 | 3123 |
static bool inNode(const Node& n) {
|
| 3122 | 3124 |
return Parent::inNode(n); |
| 3123 | 3125 |
} |
| 3124 | 3126 |
|
| 3125 | 3127 |
/// \brief Returns true when the node is out-node. |
| 3126 | 3128 |
/// |
| 3127 | 3129 |
/// Returns true when the node is out-node. |
| 3128 | 3130 |
static bool outNode(const Node& n) {
|
| 3129 | 3131 |
return Parent::outNode(n); |
| 3130 | 3132 |
} |
| 3131 | 3133 |
|
| 3132 | 3134 |
/// \brief Returns true when the arc is arc in the original digraph. |
| 3133 | 3135 |
/// |
| 3134 | 3136 |
/// Returns true when the arc is arc in the original digraph. |
| 3135 | 3137 |
static bool origArc(const Arc& a) {
|
| 3136 | 3138 |
return Parent::origArc(a); |
| 3137 | 3139 |
} |
| 3138 | 3140 |
|
0 comments (0 inline)