gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Renamings in connectivity.h and bug fix in DfsVisit (#61) - The include guard, the private namespace and some local varibles are renamed - The stop() must be called in DfsVisit, if there are not outgoing arcs from the added node
0 2 0
default
2 files changed with 65 insertions and 61 deletions:
↑ Collapse diff ↑
Ignore white space 8 line context
... ...
@@ -15,10 +15,10 @@
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19
#ifndef LEMON_TOPOLOGY_H
20
#define LEMON_TOPOLOGY_H
19
#ifndef LEMON_CONNECTIVITY_H
20
#define LEMON_CONNECTIVITY_H
21 21

	
22 22
#include <lemon/dfs.h>
23 23
#include <lemon/bfs.h>
24 24
#include <lemon/core.h>
... ...
@@ -153,9 +153,9 @@
153 153
    }
154 154
    return compNum;
155 155
  }
156 156

	
157
  namespace _topology_bits {
157
  namespace _connectivity_bits {
158 158

	
159 159
    template <typename Digraph, typename Iterator >
160 160
    struct LeaveOrderVisitor : public DfsVisitor<Digraph> {
161 161
    public:
... ...
@@ -187,21 +187,21 @@
187 187
      Value& _value;
188 188
    };
189 189

	
190 190
    template <typename Digraph, typename ArcMap>
191
    struct StronglyConnectedCutEdgesVisitor : public DfsVisitor<Digraph> {
191
    struct StronglyConnectedCutArcsVisitor : public DfsVisitor<Digraph> {
192 192
    public:
193 193
      typedef typename Digraph::Node Node;
194 194
      typedef typename Digraph::Arc Arc;
195 195

	
196
      StronglyConnectedCutEdgesVisitor(const Digraph& digraph,
197
                                       ArcMap& cutMap,
198
                                       int& cutNum)
196
      StronglyConnectedCutArcsVisitor(const Digraph& digraph,
197
                                      ArcMap& cutMap,
198
                                      int& cutNum)
199 199
        : _digraph(digraph), _cutMap(cutMap), _cutNum(cutNum),
200
          _compMap(digraph), _num(0) {
200
          _compMap(digraph, -1), _num(-1) {
201 201
      }
202 202

	
203
      void stop(const Node&) {
203
      void start(const Node&) {
204 204
        ++_num;
205 205
      }
206 206

	
207 207
      void reach(const Node& node) {
... ...
@@ -247,9 +247,9 @@
247 247

	
248 248
    typename Digraph::Node source = NodeIt(digraph);
249 249
    if (source == INVALID) return true;
250 250

	
251
    using namespace _topology_bits;
251
    using namespace _connectivity_bits;
252 252

	
253 253
    typedef DfsVisitor<Digraph> Visitor;
254 254
    Visitor visitor;
255 255

	
... ...
@@ -264,8 +264,9 @@
264 264
      }
265 265
    }
266 266

	
267 267
    typedef ReverseDigraph<const Digraph> RDigraph;
268
    typedef typename RDigraph::NodeIt RNodeIt;
268 269
    RDigraph rdigraph(digraph);
269 270

	
270 271
    typedef DfsVisitor<Digraph> RVisitor;
271 272
    RVisitor rvisitor;
... ...
@@ -274,9 +275,9 @@
274 275
    rdfs.init();
275 276
    rdfs.addSource(source);
276 277
    rdfs.start();
277 278

	
278
    for (NodeIt it(rdigraph); it != INVALID; ++it) {
279
    for (RNodeIt it(rdigraph); it != INVALID; ++it) {
279 280
      if (!rdfs.reached(it)) {
280 281
        return false;
281 282
      }
282 283
    }
... ...
@@ -301,9 +302,9 @@
301 302
  template <typename Digraph>
302 303
  int countStronglyConnectedComponents(const Digraph& digraph) {
303 304
    checkConcept<concepts::Digraph, Digraph>();
304 305

	
305
    using namespace _topology_bits;
306
    using namespace _connectivity_bits;
306 307

	
307 308
    typedef typename Digraph::Node Node;
308 309
    typedef typename Digraph::Arc Arc;
309 310
    typedef typename Digraph::NodeIt NodeIt;
... ...
@@ -373,9 +374,9 @@
373 374
    typedef typename Digraph::Node Node;
374 375
    typedef typename Digraph::NodeIt NodeIt;
375 376
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
376 377

	
377
    using namespace _topology_bits;
378
    using namespace _connectivity_bits;
378 379

	
379 380
    typedef std::vector<Node> Container;
380 381
    typedef typename Container::iterator Iterator;
381 382

	
... ...
@@ -437,9 +438,9 @@
437 438
    typedef typename Digraph::Arc Arc;
438 439
    typedef typename Digraph::NodeIt NodeIt;
439 440
    checkConcept<concepts::WriteMap<Arc, bool>, ArcMap>();
440 441

	
441
    using namespace _topology_bits;
442
    using namespace _connectivity_bits;
442 443

	
443 444
    typedef std::vector<Node> Container;
444 445
    typedef typename Container::iterator Iterator;
445 446

	
... ...
@@ -462,9 +463,9 @@
462 463
    RDigraph rgraph(graph);
463 464

	
464 465
    int cutNum = 0;
465 466

	
466
    typedef StronglyConnectedCutEdgesVisitor<RDigraph, ArcMap> RVisitor;
467
    typedef StronglyConnectedCutArcsVisitor<RDigraph, ArcMap> RVisitor;
467 468
    RVisitor rvisitor(rgraph, cutMap, cutNum);
468 469

	
469 470
    DfsVisit<RDigraph, RVisitor> rdfs(rgraph, rvisitor);
470 471

	
... ...
@@ -477,9 +478,9 @@
477 478
    }
478 479
    return cutNum;
479 480
  }
480 481

	
481
  namespace _topology_bits {
482
  namespace _connectivity_bits {
482 483

	
483 484
    template <typename Digraph>
484 485
    class CountBiNodeConnectedComponentsVisitor : public DfsVisitor<Digraph> {
485 486
    public:
... ...
@@ -729,9 +730,9 @@
729 730
  int countBiNodeConnectedComponents(const Graph& graph) {
730 731
    checkConcept<concepts::Graph, Graph>();
731 732
    typedef typename Graph::NodeIt NodeIt;
732 733

	
733
    using namespace _topology_bits;
734
    using namespace _connectivity_bits;
734 735

	
735 736
    typedef CountBiNodeConnectedComponentsVisitor<Graph> Visitor;
736 737

	
737 738
    int compNum = 0;
... ...
@@ -772,9 +773,9 @@
772 773
    typedef typename Graph::NodeIt NodeIt;
773 774
    typedef typename Graph::Edge Edge;
774 775
    checkConcept<concepts::WriteMap<Edge, int>, EdgeMap>();
775 776

	
776
    using namespace _topology_bits;
777
    using namespace _connectivity_bits;
777 778

	
778 779
    typedef BiNodeConnectedComponentsVisitor<Graph, EdgeMap> Visitor;
779 780

	
780 781
    int compNum = 0;
... ...
@@ -812,9 +813,9 @@
812 813
    typedef typename Graph::Node Node;
813 814
    typedef typename Graph::NodeIt NodeIt;
814 815
    checkConcept<concepts::WriteMap<Node, bool>, NodeMap>();
815 816

	
816
    using namespace _topology_bits;
817
    using namespace _connectivity_bits;
817 818

	
818 819
    typedef BiNodeConnectedCutNodesVisitor<Graph, NodeMap> Visitor;
819 820

	
820 821
    int cutNum = 0;
... ...
@@ -831,9 +832,9 @@
831 832
    }
832 833
    return cutNum;
833 834
  }
834 835

	
835
  namespace _topology_bits {
836
  namespace _connectivity_bits {
836 837

	
837 838
    template <typename Digraph>
838 839
    class CountBiEdgeConnectedComponentsVisitor : public DfsVisitor<Digraph> {
839 840
    public:
... ...
@@ -1052,9 +1053,9 @@
1052 1053
  int countBiEdgeConnectedComponents(const Graph& graph) {
1053 1054
    checkConcept<concepts::Graph, Graph>();
1054 1055
    typedef typename Graph::NodeIt NodeIt;
1055 1056

	
1056
    using namespace _topology_bits;
1057
    using namespace _connectivity_bits;
1057 1058

	
1058 1059
    typedef CountBiEdgeConnectedComponentsVisitor<Graph> Visitor;
1059 1060

	
1060 1061
    int compNum = 0;
... ...
@@ -1094,9 +1095,9 @@
1094 1095
    typedef typename Graph::NodeIt NodeIt;
1095 1096
    typedef typename Graph::Node Node;
1096 1097
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
1097 1098

	
1098
    using namespace _topology_bits;
1099
    using namespace _connectivity_bits;
1099 1100

	
1100 1101
    typedef BiEdgeConnectedComponentsVisitor<Graph, NodeMap> Visitor;
1101 1102

	
1102 1103
    int compNum = 0;
... ...
@@ -1135,9 +1136,9 @@
1135 1136
    typedef typename Graph::NodeIt NodeIt;
1136 1137
    typedef typename Graph::Edge Edge;
1137 1138
    checkConcept<concepts::WriteMap<Edge, bool>, EdgeMap>();
1138 1139

	
1139
    using namespace _topology_bits;
1140
    using namespace _connectivity_bits;
1140 1141

	
1141 1142
    typedef BiEdgeConnectedCutEdgesVisitor<Graph, EdgeMap> Visitor;
1142 1143

	
1143 1144
    int cutNum = 0;
... ...
@@ -1155,9 +1156,9 @@
1155 1156
    return cutNum;
1156 1157
  }
1157 1158

	
1158 1159

	
1159
  namespace _topology_bits {
1160
  namespace _connectivity_bits {
1160 1161

	
1161 1162
    template <typename Digraph, typename IntNodeMap>
1162 1163
    class TopologicalSortVisitor : public DfsVisitor<Digraph> {
1163 1164
    public:
... ...
@@ -1192,9 +1193,9 @@
1192 1193
  /// \see checkedTopologicalSort
1193 1194
  /// \see dag
1194 1195
  template <typename Digraph, typename NodeMap>
1195 1196
  void topologicalSort(const Digraph& graph, NodeMap& order) {
1196
    using namespace _topology_bits;
1197
    using namespace _connectivity_bits;
1197 1198

	
1198 1199
    checkConcept<concepts::Digraph, Digraph>();
1199 1200
    checkConcept<concepts::WriteMap<typename Digraph::Node, int>, NodeMap>();
1200 1201

	
... ...
@@ -1233,10 +1234,10 @@
1233 1234
  ///
1234 1235
  /// \see topologicalSort
1235 1236
  /// \see dag
1236 1237
  template <typename Digraph, typename NodeMap>
1237
  bool checkedTopologicalSort(const Digraph& graph, NodeMap& order) {
1238
    using namespace _topology_bits;
1238
  bool checkedTopologicalSort(const Digraph& digraph, NodeMap& order) {
1239
    using namespace _connectivity_bits;
1239 1240

	
1240 1241
    checkConcept<concepts::Digraph, Digraph>();
1241 1242
    checkConcept<concepts::ReadWriteMap<typename Digraph::Node, int>,
1242 1243
      NodeMap>();
... ...
@@ -1244,23 +1245,25 @@
1244 1245
    typedef typename Digraph::Node Node;
1245 1246
    typedef typename Digraph::NodeIt NodeIt;
1246 1247
    typedef typename Digraph::Arc Arc;
1247 1248

	
1248
    order = constMap<Node, int, -1>();
1249
    for (NodeIt it(digraph); it != INVALID; ++it) {
1250
      order.set(it, -1);
1251
    }
1249 1252

	
1250 1253
    TopologicalSortVisitor<Digraph, NodeMap>
1251
      visitor(order, countNodes(graph));
1254
      visitor(order, countNodes(digraph));
1252 1255

	
1253 1256
    DfsVisit<Digraph, TopologicalSortVisitor<Digraph, NodeMap> >
1254
      dfs(graph, visitor);
1257
      dfs(digraph, visitor);
1255 1258

	
1256 1259
    dfs.init();
1257
    for (NodeIt it(graph); it != INVALID; ++it) {
1260
    for (NodeIt it(digraph); it != INVALID; ++it) {
1258 1261
      if (!dfs.reached(it)) {
1259 1262
        dfs.addSource(it);
1260 1263
        while (!dfs.emptyQueue()) {
1261
           Arc edge = dfs.nextArc();
1262
           Node target = graph.target(edge);
1264
           Arc arc = dfs.nextArc();
1265
           Node target = digraph.target(arc);
1263 1266
           if (dfs.reached(target) && order[target] == -1) {
1264 1267
             return false;
1265 1268
           }
1266 1269
           dfs.processNextArc();
... ...
@@ -1278,9 +1281,9 @@
1278 1281
  /// an Directed Acyclic Digraph.
1279 1282
  /// \return %False when the graph is not DAG.
1280 1283
  /// \see acyclic
1281 1284
  template <typename Digraph>
1282
  bool dag(const Digraph& graph) {
1285
  bool dag(const Digraph& digraph) {
1283 1286

	
1284 1287
    checkConcept<concepts::Digraph, Digraph>();
1285 1288

	
1286 1289
    typedef typename Digraph::Node Node;
... ...
@@ -1289,20 +1292,20 @@
1289 1292

	
1290 1293
    typedef typename Digraph::template NodeMap<bool> ProcessedMap;
1291 1294

	
1292 1295
    typename Dfs<Digraph>::template SetProcessedMap<ProcessedMap>::
1293
      Create dfs(graph);
1296
      Create dfs(digraph);
1294 1297

	
1295
    ProcessedMap processed(graph);
1298
    ProcessedMap processed(digraph);
1296 1299
    dfs.processedMap(processed);
1297 1300

	
1298 1301
    dfs.init();
1299
    for (NodeIt it(graph); it != INVALID; ++it) {
1302
    for (NodeIt it(digraph); it != INVALID; ++it) {
1300 1303
      if (!dfs.reached(it)) {
1301 1304
        dfs.addSource(it);
1302 1305
        while (!dfs.emptyQueue()) {
1303 1306
          Arc edge = dfs.nextArc();
1304
          Node target = graph.target(edge);
1307
          Node target = digraph.target(edge);
1305 1308
          if (dfs.reached(target) && !processed[target]) {
1306 1309
            return false;
1307 1310
          }
1308 1311
          dfs.processNextArc();
... ...
@@ -1379,9 +1382,9 @@
1379 1382
    }
1380 1383
    return true;
1381 1384
  }
1382 1385

	
1383
  namespace _topology_bits {
1386
  namespace _connectivity_bits {
1384 1387

	
1385 1388
    template <typename Digraph>
1386 1389
    class BipartiteVisitor : public BfsVisitor<Digraph> {
1387 1390
    public:
... ...
@@ -1448,9 +1451,9 @@
1448 1451
  /// \return %True if \c graph is bipartite, %false otherwise.
1449 1452
  /// \sa bipartitePartitions
1450 1453
  template<typename Graph>
1451 1454
  inline bool bipartite(const Graph &graph){
1452
    using namespace _topology_bits;
1455
    using namespace _connectivity_bits;
1453 1456

	
1454 1457
    checkConcept<concepts::Graph, Graph>();
1455 1458

	
1456 1459
    typedef typename Graph::NodeIt NodeIt;
... ...
@@ -1488,9 +1491,9 @@
1488 1491
  /// two partitions of the graph.
1489 1492
  /// \return %True if \c graph is bipartite, %false otherwise.
1490 1493
  template<typename Graph, typename NodeMap>
1491 1494
  inline bool bipartitePartitions(const Graph &graph, NodeMap &partMap){
1492
    using namespace _topology_bits;
1495
    using namespace _connectivity_bits;
1493 1496

	
1494 1497
    checkConcept<concepts::Graph, Graph>();
1495 1498

	
1496 1499
    typedef typename Graph::Node Node;
... ...
@@ -1519,28 +1522,28 @@
1519 1522
  /// \brief Returns true when there are not loop edges in the graph.
1520 1523
  ///
1521 1524
  /// Returns true when there are not loop edges in the graph.
1522 1525
  template <typename Digraph>
1523
  bool loopFree(const Digraph& graph) {
1524
    for (typename Digraph::ArcIt it(graph); it != INVALID; ++it) {
1525
      if (graph.source(it) == graph.target(it)) return false;
1526
  bool loopFree(const Digraph& digraph) {
1527
    for (typename Digraph::ArcIt it(digraph); it != INVALID; ++it) {
1528
      if (digraph.source(it) == digraph.target(it)) return false;
1526 1529
    }
1527 1530
    return true;
1528 1531
  }
1529 1532

	
1530 1533
  /// \brief Returns true when there are not parallel edges in the graph.
1531 1534
  ///
1532 1535
  /// Returns true when there are not parallel edges in the graph.
1533 1536
  template <typename Digraph>
1534
  bool parallelFree(const Digraph& graph) {
1535
    typename Digraph::template NodeMap<bool> reached(graph, false);
1536
    for (typename Digraph::NodeIt n(graph); n != INVALID; ++n) {
1537
      for (typename Digraph::OutArcIt e(graph, n); e != INVALID; ++e) {
1538
        if (reached[graph.target(e)]) return false;
1539
        reached.set(graph.target(e), true);
1537
  bool parallelFree(const Digraph& digraph) {
1538
    typename Digraph::template NodeMap<bool> reached(digraph, false);
1539
    for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
1540
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1541
        if (reached[digraph.target(a)]) return false;
1542
        reached.set(digraph.target(a), true);
1540 1543
      }
1541
      for (typename Digraph::OutArcIt e(graph, n); e != INVALID; ++e) {
1542
        reached.set(graph.target(e), false);
1544
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1545
        reached.set(digraph.target(a), false);
1543 1546
      }
1544 1547
    }
1545 1548
    return true;
1546 1549
  }
... ...
@@ -1550,23 +1553,23 @@
1550 1553
  ///
1551 1554
  /// Returns true when there are not loop edges and parallel edges in
1552 1555
  /// the graph.
1553 1556
  template <typename Digraph>
1554
  bool simpleDigraph(const Digraph& graph) {
1555
    typename Digraph::template NodeMap<bool> reached(graph, false);
1556
    for (typename Digraph::NodeIt n(graph); n != INVALID; ++n) {
1557
  bool simpleDigraph(const Digraph& digraph) {
1558
    typename Digraph::template NodeMap<bool> reached(digraph, false);
1559
    for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
1557 1560
      reached.set(n, true);
1558
      for (typename Digraph::OutArcIt e(graph, n); e != INVALID; ++e) {
1559
        if (reached[graph.target(e)]) return false;
1560
        reached.set(graph.target(e), true);
1561
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1562
        if (reached[digraph.target(a)]) return false;
1563
        reached.set(digraph.target(a), true);
1561 1564
      }
1562
      for (typename Digraph::OutArcIt e(graph, n); e != INVALID; ++e) {
1563
        reached.set(graph.target(e), false);
1565
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1566
        reached.set(digraph.target(a), false);
1564 1567
      }
1565 1568
      reached.set(n, false);
1566 1569
    }
1567 1570
    return true;
1568 1571
  }
1569 1572

	
1570 1573
} //namespace lemon
1571 1574

	
1572
#endif //LEMON_TOPOLOGY_H
1575
#endif //LEMON_CONNECTIVITY_H
Ignore white space 6 line context
... ...
@@ -1409,8 +1409,9 @@
1409 1409
          if (e != INVALID) {
1410 1410
            _stack[++_stack_head] = e;
1411 1411
          } else {
1412 1412
            _visitor->leave(s);
1413
            _visitor->stop(s);
1413 1414
          }
1414 1415
        }
1415 1416
    }
1416 1417

	
0 comments (0 inline)