# HG changeset patch
# User Balazs Dezso <deba@inf.elte.hu>
# Date 1228310602 -3600
# Node ID 015e4ee9bae4c0ba898432dc3201919b5cf02e3f
# Parent ad483acf1654bd4d0c093b807b858ed59529f78e
Renamings in connectivity.h and bug fix in DfsVisit
- 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
diff -r ad483acf1654 -r 015e4ee9bae4 lemon/connectivity.h
a
|
b
|
|
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> |
… |
… |
|
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> { |
… |
… |
|
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 | |
… |
… |
|
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; |
… |
… |
|
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; |
… |
… |
|
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 | } |
… |
… |
|
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; |
… |
… |
|
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; |
… |
… |
|
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; |
… |
… |
|
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); |
… |
… |
|
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> { |
… |
… |
|
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 | |
… |
… |
|
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 | |
… |
… |
|
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 | |
… |
… |
|
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> { |
… |
… |
|
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 | |
… |
… |
|
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 | |
… |
… |
|
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 | |
… |
… |
|
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> { |
… |
… |
|
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>(); |
… |
… |
|
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>, |
… |
… |
|
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 | } |
… |
… |
|
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 | |
… |
… |
|
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 | } |
… |
… |
|
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> { |
… |
… |
|
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 | |
… |
… |
|
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 | |
… |
… |
|
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 | } |
… |
… |
|
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; |
… |
… |
|
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 | } |
… |
… |
|
1569 | 1572 | |
1570 | 1573 | } //namespace lemon |
1571 | 1574 | |
1572 | | #endif //LEMON_TOPOLOGY_H |
| 1575 | #endif //LEMON_CONNECTIVITY_H |
diff -r ad483acf1654 -r 015e4ee9bae4 lemon/dfs.h
a
|
b
|
|
1410 | 1410 | _stack[++_stack_head] = e; |
1411 | 1411 | } else { |
1412 | 1412 | _visitor->leave(s); |
| 1413 | _visitor->stop(s); |
1413 | 1414 | } |
1414 | 1415 | } |
1415 | 1416 | } |