| ... | ... |
@@ -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 |
|
| 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 |
|
| 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 |
|
|
| 196 |
StronglyConnectedCutArcsVisitor(const Digraph& digraph, |
|
| 197 |
ArcMap& cutMap, |
|
| 198 |
int& cutNum) |
|
| 199 | 199 |
: _digraph(digraph), _cutMap(cutMap), _cutNum(cutNum), |
| 200 |
_compMap(digraph), _num( |
|
| 200 |
_compMap(digraph, -1), _num(-1) {
|
|
| 201 | 201 |
} |
| 202 | 202 |
|
| 203 |
void |
|
| 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 |
|
| 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 ( |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
|
| 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( |
|
| 1254 |
visitor(order, countNodes(digraph)); |
|
| 1252 | 1255 |
|
| 1253 | 1256 |
DfsVisit<Digraph, TopologicalSortVisitor<Digraph, NodeMap> > |
| 1254 |
dfs( |
|
| 1257 |
dfs(digraph, visitor); |
|
| 1255 | 1258 |
|
| 1256 | 1259 |
dfs.init(); |
| 1257 |
for (NodeIt 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& |
|
| 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( |
|
| 1296 |
Create dfs(digraph); |
|
| 1294 | 1297 |
|
| 1295 |
ProcessedMap processed( |
|
| 1298 |
ProcessedMap processed(digraph); |
|
| 1296 | 1299 |
dfs.processedMap(processed); |
| 1297 | 1300 |
|
| 1298 | 1301 |
dfs.init(); |
| 1299 |
for (NodeIt 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 = |
|
| 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 |
|
| 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 |
|
| 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 |
|
| 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 |
|
|
| 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 |
|
|
| 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 |
|
|
| 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 // |
|
| 1575 |
#endif //LEMON_CONNECTIVITY_H |
0 comments (0 inline)