lemon/bits/path_dump.h
changeset 243 32155c88f59b
parent 100 4f754b4cf82b
child 440 88ed40ad0d4f
child 885 1f2a734581f8
equal deleted inserted replaced
0:757cd130ea3e 1:41299e406e1b
     1 /* -*- C++ -*-
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     4  *
     5  * Copyright (C) 2003-2008
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     8  *
    51 
    51 
    52     class RevArcIt {
    52     class RevArcIt {
    53     public:
    53     public:
    54       RevArcIt() {}
    54       RevArcIt() {}
    55       RevArcIt(Invalid) : path(0), current(INVALID) {}
    55       RevArcIt(Invalid) : path(0), current(INVALID) {}
    56       RevArcIt(const PredMapPath& _path) 
    56       RevArcIt(const PredMapPath& _path)
    57         : path(&_path), current(_path.target) {
    57         : path(&_path), current(_path.target) {
    58         if (path->predMap[current] == INVALID) current = INVALID;
    58         if (path->predMap[current] == INVALID) current = INVALID;
    59       }
    59       }
    60 
    60 
    61       operator const typename Digraph::Arc() const {
    61       operator const typename Digraph::Arc() const {
    66         current = path->digraph.source(path->predMap[current]);
    66         current = path->digraph.source(path->predMap[current]);
    67         if (path->predMap[current] == INVALID) current = INVALID;
    67         if (path->predMap[current] == INVALID) current = INVALID;
    68         return *this;
    68         return *this;
    69       }
    69       }
    70 
    70 
    71       bool operator==(const RevArcIt& e) const { 
    71       bool operator==(const RevArcIt& e) const {
    72         return current == e.current; 
    72         return current == e.current;
    73       }
    73       }
    74 
    74 
    75       bool operator!=(const RevArcIt& e) const {
    75       bool operator!=(const RevArcIt& e) const {
    76         return current != e.current; 
    76         return current != e.current;
    77       }
    77       }
    78 
    78 
    79       bool operator<(const RevArcIt& e) const { 
    79       bool operator<(const RevArcIt& e) const {
    80         return current < e.current; 
    80         return current < e.current;
    81       }
    81       }
    82       
    82 
    83     private:
    83     private:
    84       const PredMapPath* path;
    84       const PredMapPath* path;
    85       typename Digraph::Node current;
    85       typename Digraph::Node current;
    86     };
    86     };
    87 
    87 
    99 
    99 
   100     typedef _Digraph Digraph;
   100     typedef _Digraph Digraph;
   101     typedef typename Digraph::Arc Arc;
   101     typedef typename Digraph::Arc Arc;
   102     typedef _PredMatrixMap PredMatrixMap;
   102     typedef _PredMatrixMap PredMatrixMap;
   103 
   103 
   104     PredMatrixMapPath(const Digraph& _digraph, 
   104     PredMatrixMapPath(const Digraph& _digraph,
   105                       const PredMatrixMap& _predMatrixMap,
   105                       const PredMatrixMap& _predMatrixMap,
   106                       typename Digraph::Node _source, 
   106                       typename Digraph::Node _source,
   107                       typename Digraph::Node _target)
   107                       typename Digraph::Node _target)
   108       : digraph(_digraph), predMatrixMap(_predMatrixMap), 
   108       : digraph(_digraph), predMatrixMap(_predMatrixMap),
   109         source(_source), target(_target) {}
   109         source(_source), target(_target) {}
   110 
   110 
   111     int length() const {
   111     int length() const {
   112       int len = 0;
   112       int len = 0;
   113       typename Digraph::Node node = target;
   113       typename Digraph::Node node = target;
   125 
   125 
   126     class RevArcIt {
   126     class RevArcIt {
   127     public:
   127     public:
   128       RevArcIt() {}
   128       RevArcIt() {}
   129       RevArcIt(Invalid) : path(0), current(INVALID) {}
   129       RevArcIt(Invalid) : path(0), current(INVALID) {}
   130       RevArcIt(const PredMatrixMapPath& _path) 
   130       RevArcIt(const PredMatrixMapPath& _path)
   131         : path(&_path), current(_path.target) {
   131         : path(&_path), current(_path.target) {
   132         if (path->predMatrixMap(path->source, current) == INVALID) 
   132         if (path->predMatrixMap(path->source, current) == INVALID)
   133           current = INVALID;
   133           current = INVALID;
   134       }
   134       }
   135 
   135 
   136       operator const typename Digraph::Arc() const {
   136       operator const typename Digraph::Arc() const {
   137         return path->predMatrixMap(path->source, current);
   137         return path->predMatrixMap(path->source, current);
   138       }
   138       }
   139 
   139 
   140       RevArcIt& operator++() {
   140       RevArcIt& operator++() {
   141         current = 
   141         current =
   142           path->digraph.source(path->predMatrixMap(path->source, current));
   142           path->digraph.source(path->predMatrixMap(path->source, current));
   143         if (path->predMatrixMap(path->source, current) == INVALID) 
   143         if (path->predMatrixMap(path->source, current) == INVALID)
   144           current = INVALID;
   144           current = INVALID;
   145         return *this;
   145         return *this;
   146       }
   146       }
   147 
   147 
   148       bool operator==(const RevArcIt& e) const { 
   148       bool operator==(const RevArcIt& e) const {
   149         return current == e.current; 
   149         return current == e.current;
   150       }
   150       }
   151 
   151 
   152       bool operator!=(const RevArcIt& e) const {
   152       bool operator!=(const RevArcIt& e) const {
   153         return current != e.current; 
   153         return current != e.current;
   154       }
   154       }
   155 
   155 
   156       bool operator<(const RevArcIt& e) const { 
   156       bool operator<(const RevArcIt& e) const {
   157         return current < e.current; 
   157         return current < e.current;
   158       }
   158       }
   159       
   159 
   160     private:
   160     private:
   161       const PredMatrixMapPath* path;
   161       const PredMatrixMapPath* path;
   162       typename Digraph::Node current;
   162       typename Digraph::Node current;
   163     };
   163     };
   164 
   164