gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge
0 4 1
merge default
0 files changed with 625 insertions and 247 deletions:
↑ Collapse diff ↑
Ignore white space 12 line context
1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2
 *
3
 * This file is a part of LEMON, a generic C++ optimization library.
4
 *
5
 * Copyright (C) 2003-2009
6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8
 *
9
 * Permission to use, modify and distribute this software is granted
10
 * provided that this copyright notice appears in all copies. For
11
 * precise terms see the accompanying LICENSE file.
12
 *
13
 * This software is provided "AS IS" with no warranty of any kind,
14
 * express or implied, and with no claim as to its suitability for any
15
 * purpose.
16
 *
17
 */
18

	
19
#include <lemon/connectivity.h>
20
#include <lemon/list_graph.h>
21
#include <lemon/adaptors.h>
22

	
23
#include "test_tools.h"
24

	
25
using namespace lemon;
26

	
27

	
28
int main()
29
{
30
  typedef ListDigraph Digraph;
31
  typedef Undirector<Digraph> Graph;
32
  
33
  {
34
    Digraph d;
35
    Digraph::NodeMap<int> order(d);
36
    Graph g(d);
37
    
38
    check(stronglyConnected(d), "The empty digraph is strongly connected");
39
    check(countStronglyConnectedComponents(d) == 0,
40
          "The empty digraph has 0 strongly connected component");
41
    check(connected(g), "The empty graph is connected");
42
    check(countConnectedComponents(g) == 0,
43
          "The empty graph has 0 connected component");
44

	
45
    check(biNodeConnected(g), "The empty graph is bi-node-connected");
46
    check(countBiNodeConnectedComponents(g) == 0,
47
          "The empty graph has 0 bi-node-connected component");
48
    check(biEdgeConnected(g), "The empty graph is bi-edge-connected");
49
    check(countBiEdgeConnectedComponents(g) == 0,
50
          "The empty graph has 0 bi-edge-connected component");
51
          
52
    check(dag(d), "The empty digraph is DAG.");
53
    check(checkedTopologicalSort(d, order), "The empty digraph is DAG.");
54
    check(loopFree(d), "The empty digraph is loop-free.");
55
    check(parallelFree(d), "The empty digraph is parallel-free.");
56
    check(simpleGraph(d), "The empty digraph is simple.");
57

	
58
    check(acyclic(g), "The empty graph is acyclic.");
59
    check(tree(g), "The empty graph is tree.");
60
    check(bipartite(g), "The empty graph is bipartite.");
61
    check(loopFree(g), "The empty graph is loop-free.");
62
    check(parallelFree(g), "The empty graph is parallel-free.");
63
    check(simpleGraph(g), "The empty graph is simple.");
64
  }
65

	
66
  {
67
    Digraph d;
68
    Digraph::NodeMap<int> order(d);
69
    Graph g(d);
70
    Digraph::Node n = d.addNode();
71

	
72
    check(stronglyConnected(d), "This digraph is strongly connected");
73
    check(countStronglyConnectedComponents(d) == 1,
74
          "This digraph has 1 strongly connected component");
75
    check(connected(g), "This graph is connected");
76
    check(countConnectedComponents(g) == 1,
77
          "This graph has 1 connected component");
78

	
79
    check(biNodeConnected(g), "This graph is bi-node-connected");
80
    check(countBiNodeConnectedComponents(g) == 0,
81
          "This graph has 0 bi-node-connected component");
82
    check(biEdgeConnected(g), "This graph is bi-edge-connected");
83
    check(countBiEdgeConnectedComponents(g) == 1,
84
          "This graph has 1 bi-edge-connected component");
85
          
86
    check(dag(d), "This digraph is DAG.");
87
    check(checkedTopologicalSort(d, order), "This digraph is DAG.");
88
    check(loopFree(d), "This digraph is loop-free.");
89
    check(parallelFree(d), "This digraph is parallel-free.");
90
    check(simpleGraph(d), "This digraph is simple.");
91

	
92
    check(acyclic(g), "This graph is acyclic.");
93
    check(tree(g), "This graph is tree.");
94
    check(bipartite(g), "This graph is bipartite.");
95
    check(loopFree(g), "This graph is loop-free.");
96
    check(parallelFree(g), "This graph is parallel-free.");
97
    check(simpleGraph(g), "This graph is simple.");
98
  }
99

	
100
  {
101
    Digraph d;
102
    Digraph::NodeMap<int> order(d);
103
    Graph g(d);
104
    
105
    Digraph::Node n1 = d.addNode();
106
    Digraph::Node n2 = d.addNode();
107
    Digraph::Node n3 = d.addNode();
108
    Digraph::Node n4 = d.addNode();
109
    Digraph::Node n5 = d.addNode();
110
    Digraph::Node n6 = d.addNode();
111
    
112
    d.addArc(n1, n3);
113
    d.addArc(n3, n2);
114
    d.addArc(n2, n1);
115
    d.addArc(n4, n2);
116
    d.addArc(n4, n3);
117
    d.addArc(n5, n6);
118
    d.addArc(n6, n5);
119

	
120
    check(!stronglyConnected(d), "This digraph is not strongly connected");
121
    check(countStronglyConnectedComponents(d) == 3,
122
          "This digraph has 3 strongly connected components");
123
    check(!connected(g), "This graph is not connected");
124
    check(countConnectedComponents(g) == 2,
125
          "This graph has 2 connected components");
126

	
127
    check(!dag(d), "This digraph is not DAG.");
128
    check(!checkedTopologicalSort(d, order), "This digraph is not DAG.");
129
    check(loopFree(d), "This digraph is loop-free.");
130
    check(parallelFree(d), "This digraph is parallel-free.");
131
    check(simpleGraph(d), "This digraph is simple.");
132

	
133
    check(!acyclic(g), "This graph is not acyclic.");
134
    check(!tree(g), "This graph is not tree.");
135
    check(!bipartite(g), "This graph is not bipartite.");
136
    check(loopFree(g), "This graph is loop-free.");
137
    check(!parallelFree(g), "This graph is not parallel-free.");
138
    check(!simpleGraph(g), "This graph is not simple.");
139
    
140
    d.addArc(n3, n3);
141
    
142
    check(!loopFree(d), "This digraph is not loop-free.");
143
    check(!loopFree(g), "This graph is not loop-free.");
144
    check(!simpleGraph(d), "This digraph is not simple.");
145
    
146
    d.addArc(n3, n2);
147
    
148
    check(!parallelFree(d), "This digraph is not parallel-free.");
149
  }
150
  
151
  {
152
    Digraph d;
153
    Digraph::ArcMap<bool> cutarcs(d, false);
154
    Graph g(d);
155
    
156
    Digraph::Node n1 = d.addNode();
157
    Digraph::Node n2 = d.addNode();
158
    Digraph::Node n3 = d.addNode();
159
    Digraph::Node n4 = d.addNode();
160
    Digraph::Node n5 = d.addNode();
161
    Digraph::Node n6 = d.addNode();
162
    Digraph::Node n7 = d.addNode();
163
    Digraph::Node n8 = d.addNode();
164

	
165
    d.addArc(n1, n2);
166
    d.addArc(n5, n1);
167
    d.addArc(n2, n8);
168
    d.addArc(n8, n5);
169
    d.addArc(n6, n4);
170
    d.addArc(n4, n6);
171
    d.addArc(n2, n5);
172
    d.addArc(n1, n8);
173
    d.addArc(n6, n7);
174
    d.addArc(n7, n6);
175
   
176
    check(!stronglyConnected(d), "This digraph is not strongly connected");
177
    check(countStronglyConnectedComponents(d) == 3,
178
          "This digraph has 3 strongly connected components");
179
    Digraph::NodeMap<int> scomp1(d);
180
    check(stronglyConnectedComponents(d, scomp1) == 3,
181
          "This digraph has 3 strongly connected components");
182
    check(scomp1[n1] != scomp1[n3] && scomp1[n1] != scomp1[n4] &&
183
          scomp1[n3] != scomp1[n4], "Wrong stronglyConnectedComponents()");
184
    check(scomp1[n1] == scomp1[n2] && scomp1[n1] == scomp1[n5] &&
185
          scomp1[n1] == scomp1[n8], "Wrong stronglyConnectedComponents()");
186
    check(scomp1[n4] == scomp1[n6] && scomp1[n4] == scomp1[n7],
187
          "Wrong stronglyConnectedComponents()");
188
    Digraph::ArcMap<bool> scut1(d, false);
189
    check(stronglyConnectedCutArcs(d, scut1) == 0,
190
          "This digraph has 0 strongly connected cut arc.");
191
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
192
      check(!scut1[a], "Wrong stronglyConnectedCutArcs()");
193
    }
194

	
195
    check(!connected(g), "This graph is not connected");
196
    check(countConnectedComponents(g) == 3,
197
          "This graph has 3 connected components");
198
    Graph::NodeMap<int> comp(g);
199
    check(connectedComponents(g, comp) == 3,
200
          "This graph has 3 connected components");
201
    check(comp[n1] != comp[n3] && comp[n1] != comp[n4] &&
202
          comp[n3] != comp[n4], "Wrong connectedComponents()");
203
    check(comp[n1] == comp[n2] && comp[n1] == comp[n5] &&
204
          comp[n1] == comp[n8], "Wrong connectedComponents()");
205
    check(comp[n4] == comp[n6] && comp[n4] == comp[n7],
206
          "Wrong connectedComponents()");
207

	
208
    cutarcs[d.addArc(n3, n1)] = true;
209
    cutarcs[d.addArc(n3, n5)] = true;
210
    cutarcs[d.addArc(n3, n8)] = true;
211
    cutarcs[d.addArc(n8, n6)] = true;
212
    cutarcs[d.addArc(n8, n7)] = true;
213

	
214
    check(!stronglyConnected(d), "This digraph is not strongly connected");
215
    check(countStronglyConnectedComponents(d) == 3,
216
          "This digraph has 3 strongly connected components");
217
    Digraph::NodeMap<int> scomp2(d);
218
    check(stronglyConnectedComponents(d, scomp2) == 3,
219
          "This digraph has 3 strongly connected components");
220
    check(scomp2[n3] == 0, "Wrong stronglyConnectedComponents()");
221
    check(scomp2[n1] == 1 && scomp2[n2] == 1 && scomp2[n5] == 1 &&
222
          scomp2[n8] == 1, "Wrong stronglyConnectedComponents()");
223
    check(scomp2[n4] == 2 && scomp2[n6] == 2 && scomp2[n7] == 2,
224
          "Wrong stronglyConnectedComponents()");
225
    Digraph::ArcMap<bool> scut2(d, false);
226
    check(stronglyConnectedCutArcs(d, scut2) == 5,
227
          "This digraph has 5 strongly connected cut arcs.");
228
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
229
      check(scut2[a] == cutarcs[a], "Wrong stronglyConnectedCutArcs()");
230
    }
231
  }
232

	
233
  {
234
    // DAG example for topological sort from the book New Algorithms
235
    // (T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein)
236
    Digraph d;
237
    Digraph::NodeMap<int> order(d);
238
    
239
    Digraph::Node belt = d.addNode();
240
    Digraph::Node trousers = d.addNode();
241
    Digraph::Node necktie = d.addNode();
242
    Digraph::Node coat = d.addNode();
243
    Digraph::Node socks = d.addNode();
244
    Digraph::Node shirt = d.addNode();
245
    Digraph::Node shoe = d.addNode();
246
    Digraph::Node watch = d.addNode();
247
    Digraph::Node pants = d.addNode();
248

	
249
    d.addArc(socks, shoe);
250
    d.addArc(pants, shoe);
251
    d.addArc(pants, trousers);
252
    d.addArc(trousers, shoe);
253
    d.addArc(trousers, belt);
254
    d.addArc(belt, coat);
255
    d.addArc(shirt, belt);
256
    d.addArc(shirt, necktie);
257
    d.addArc(necktie, coat);
258
    
259
    check(dag(d), "This digraph is DAG.");
260
    topologicalSort(d, order);
261
    for (Digraph::ArcIt a(d); a != INVALID; ++a) {
262
      check(order[d.source(a)] < order[d.target(a)],
263
            "Wrong topologicalSort()");
264
    }
265
  }
266

	
267
  {
268
    ListGraph g;
269
    ListGraph::NodeMap<bool> map(g);
270
    
271
    ListGraph::Node n1 = g.addNode();
272
    ListGraph::Node n2 = g.addNode();
273
    ListGraph::Node n3 = g.addNode();
274
    ListGraph::Node n4 = g.addNode();
275
    ListGraph::Node n5 = g.addNode();
276
    ListGraph::Node n6 = g.addNode();
277
    ListGraph::Node n7 = g.addNode();
278

	
279
    g.addEdge(n1, n3);
280
    g.addEdge(n1, n4);
281
    g.addEdge(n2, n5);
282
    g.addEdge(n3, n6);
283
    g.addEdge(n4, n6);
284
    g.addEdge(n4, n7);
285
    g.addEdge(n5, n7);
286
   
287
    check(bipartite(g), "This graph is bipartite");
288
    check(bipartitePartitions(g, map), "This graph is bipartite");
289
    
290
    check(map[n1] == map[n2] && map[n1] == map[n6] && map[n1] == map[n7],
291
          "Wrong bipartitePartitions()");
292
    check(map[n3] == map[n4] && map[n3] == map[n5],
293
          "Wrong bipartitePartitions()");
294
  }
295

	
296
  return 0;
297
}
Ignore white space 12 line context
... ...
@@ -39,18 +39,22 @@
39 39
/// Connectivity algorithms
40 40

	
41 41
namespace lemon {
42 42

	
43 43
  /// \ingroup graph_properties
44 44
  ///
45
  /// \brief Check whether the given undirected graph is connected.
45
  /// \brief Check whether an undirected graph is connected.
46 46
  ///
47
  /// Check whether the given undirected graph is connected.
48
  /// \param graph The undirected graph.
49
  /// \return \c true when there is path between any two nodes in the graph.
47
  /// This function checks whether the given undirected graph is connected,
48
  /// i.e. there is a path between any two nodes in the graph.
49
  ///
50
  /// \return \c true if the graph is connected.
50 51
  /// \note By definition, the empty graph is connected.
52
  ///
53
  /// \see countConnectedComponents(), connectedComponents()
54
  /// \see stronglyConnected()
51 55
  template <typename Graph>
52 56
  bool connected(const Graph& graph) {
53 57
    checkConcept<concepts::Graph, Graph>();
54 58
    typedef typename Graph::NodeIt NodeIt;
55 59
    if (NodeIt(graph) == INVALID) return true;
56 60
    Dfs<Graph> dfs(graph);
... ...
@@ -64,18 +68,24 @@
64 68
  }
65 69

	
66 70
  /// \ingroup graph_properties
67 71
  ///
68 72
  /// \brief Count the number of connected components of an undirected graph
69 73
  ///
70
  /// Count the number of connected components of an undirected graph
74
  /// This function counts the number of connected components of the given
75
  /// undirected graph.
71 76
  ///
72
  /// \param graph The graph. It must be undirected.
73
  /// \return The number of components
77
  /// The connected components are the classes of an equivalence relation
78
  /// on the nodes of an undirected graph. Two nodes are in the same class
79
  /// if they are connected with a path.
80
  ///
81
  /// \return The number of connected components.
74 82
  /// \note By definition, the empty graph consists
75 83
  /// of zero connected components.
84
  ///
85
  /// \see connected(), connectedComponents()
76 86
  template <typename Graph>
77 87
  int countConnectedComponents(const Graph &graph) {
78 88
    checkConcept<concepts::Graph, Graph>();
79 89
    typedef typename Graph::Node Node;
80 90
    typedef typename Graph::Arc Arc;
81 91

	
... ...
@@ -106,23 +116,32 @@
106 116
  }
107 117

	
108 118
  /// \ingroup graph_properties
109 119
  ///
110 120
  /// \brief Find the connected components of an undirected graph
111 121
  ///
112
  /// Find the connected components of an undirected graph.
122
  /// This function finds the connected components of the given undirected
123
  /// graph.
124
  ///
125
  /// The connected components are the classes of an equivalence relation
126
  /// on the nodes of an undirected graph. Two nodes are in the same class
127
  /// if they are connected with a path.
113 128
  ///
114 129
  /// \image html connected_components.png
115 130
  /// \image latex connected_components.eps "Connected components" width=\textwidth
116 131
  ///
117
  /// \param graph The graph. It must be undirected.
132
  /// \param graph The undirected graph.
118 133
  /// \retval compMap A writable node map. The values will be set from 0 to
119
  /// the number of the connected components minus one. Each values of the map
120
  /// will be set exactly once, the values of a certain component will be
134
  /// the number of the connected components minus one. Each value of the map
135
  /// will be set exactly once, and the values of a certain component will be
121 136
  /// set continuously.
122
  /// \return The number of components
137
  /// \return The number of connected components.
138
  /// \note By definition, the empty graph consists
139
  /// of zero connected components.
140
  ///
141
  /// \see connected(), countConnectedComponents()
123 142
  template <class Graph, class NodeMap>
124 143
  int connectedComponents(const Graph &graph, NodeMap &compMap) {
125 144
    checkConcept<concepts::Graph, Graph>();
126 145
    typedef typename Graph::Node Node;
127 146
    typedef typename Graph::Arc Arc;
128 147
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
... ...
@@ -228,21 +247,23 @@
228 247

	
229 248
  }
230 249

	
231 250

	
232 251
  /// \ingroup graph_properties
233 252
  ///
234
  /// \brief Check whether the given directed graph is strongly connected.
253
  /// \brief Check whether a directed graph is strongly connected.
235 254
  ///
236
  /// Check whether the given directed graph is strongly connected. The
237
  /// graph is strongly connected when any two nodes of the graph are
255
  /// This function checks whether the given directed graph is strongly
256
  /// connected, i.e. any two nodes of the digraph are
238 257
  /// connected with directed paths in both direction.
239
  /// \return \c false when the graph is not strongly connected.
240
  /// \see connected
241 258
  ///
242
  /// \note By definition, the empty graph is strongly connected.
259
  /// \return \c true if the digraph is strongly connected.
260
  /// \note By definition, the empty digraph is strongly connected.
261
  /// 
262
  /// \see countStronglyConnectedComponents(), stronglyConnectedComponents()
263
  /// \see connected()
243 264
  template <typename Digraph>
244 265
  bool stronglyConnected(const Digraph& digraph) {
245 266
    checkConcept<concepts::Digraph, Digraph>();
246 267

	
247 268
    typedef typename Digraph::Node Node;
248 269
    typedef typename Digraph::NodeIt NodeIt;
... ...
@@ -267,13 +288,13 @@
267 288
    }
268 289

	
269 290
    typedef ReverseDigraph<const Digraph> RDigraph;
270 291
    typedef typename RDigraph::NodeIt RNodeIt;
271 292
    RDigraph rdigraph(digraph);
272 293

	
273
    typedef DfsVisitor<Digraph> RVisitor;
294
    typedef DfsVisitor<RDigraph> RVisitor;
274 295
    RVisitor rvisitor;
275 296

	
276 297
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
277 298
    rdfs.init();
278 299
    rdfs.addSource(source);
279 300
    rdfs.start();
... ...
@@ -286,24 +307,28 @@
286 307

	
287 308
    return true;
288 309
  }
289 310

	
290 311
  /// \ingroup graph_properties
291 312
  ///
292
  /// \brief Count the strongly connected components of a directed graph
313
  /// \brief Count the number of strongly connected components of a 
314
  /// directed graph
293 315
  ///
294
  /// Count the strongly connected components of a directed graph.
316
  /// This function counts the number of strongly connected components of
317
  /// the given directed graph.
318
  ///
295 319
  /// The strongly connected components are the classes of an
296
  /// equivalence relation on the nodes of the graph. Two nodes are in
320
  /// equivalence relation on the nodes of a digraph. Two nodes are in
297 321
  /// the same class if they are connected with directed paths in both
298 322
  /// direction.
299 323
  ///
300
  /// \param digraph The graph.
301
  /// \return The number of components
302
  /// \note By definition, the empty graph has zero
324
  /// \return The number of strongly connected components.
325
  /// \note By definition, the empty digraph has zero
303 326
  /// strongly connected components.
327
  ///
328
  /// \see stronglyConnected(), stronglyConnectedComponents()
304 329
  template <typename Digraph>
305 330
  int countStronglyConnectedComponents(const Digraph& digraph) {
306 331
    checkConcept<concepts::Digraph, Digraph>();
307 332

	
308 333
    using namespace _connectivity_bits;
309 334

	
... ...
@@ -352,29 +377,35 @@
352 377
  }
353 378

	
354 379
  /// \ingroup graph_properties
355 380
  ///
356 381
  /// \brief Find the strongly connected components of a directed graph
357 382
  ///
358
  /// Find the strongly connected components of a directed graph.  The
359
  /// strongly connected components are the classes of an equivalence
360
  /// relation on the nodes of the graph. Two nodes are in
361
  /// relationship when there are directed paths between them in both
362
  /// direction. In addition, the numbering of components will satisfy
363
  /// that there is no arc going from a higher numbered component to
364
  /// a lower.
383
  /// This function finds the strongly connected components of the given
384
  /// directed graph. In addition, the numbering of the components will
385
  /// satisfy that there is no arc going from a higher numbered component
386
  /// to a lower one (i.e. it provides a topological order of the components).
387
  ///
388
  /// The strongly connected components are the classes of an
389
  /// equivalence relation on the nodes of a digraph. Two nodes are in
390
  /// the same class if they are connected with directed paths in both
391
  /// direction.
365 392
  ///
366 393
  /// \image html strongly_connected_components.png
367 394
  /// \image latex strongly_connected_components.eps "Strongly connected components" width=\textwidth
368 395
  ///
369 396
  /// \param digraph The digraph.
370 397
  /// \retval compMap A writable node map. The values will be set from 0 to
371 398
  /// the number of the strongly connected components minus one. Each value
372
  /// of the map will be set exactly once, the values of a certain component
373
  /// will be set continuously.
374
  /// \return The number of components
399
  /// of the map will be set exactly once, and the values of a certain
400
  /// component will be set continuously.
401
  /// \return The number of strongly connected components.
402
  /// \note By definition, the empty digraph has zero
403
  /// strongly connected components.
404
  ///
405
  /// \see stronglyConnected(), countStronglyConnectedComponents()
375 406
  template <typename Digraph, typename NodeMap>
376 407
  int stronglyConnectedComponents(const Digraph& digraph, NodeMap& compMap) {
377 408
    checkConcept<concepts::Digraph, Digraph>();
378 409
    typedef typename Digraph::Node Node;
379 410
    typedef typename Digraph::NodeIt NodeIt;
380 411
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
... ...
@@ -421,60 +452,65 @@
421 452
  }
422 453

	
423 454
  /// \ingroup graph_properties
424 455
  ///
425 456
  /// \brief Find the cut arcs of the strongly connected components.
426 457
  ///
427
  /// Find the cut arcs of the strongly connected components.
428
  /// The strongly connected components are the classes of an equivalence
429
  /// relation on the nodes of the graph. Two nodes are in relationship
430
  /// when there are directed paths between them in both direction.
458
  /// This function finds the cut arcs of the strongly connected components
459
  /// of the given digraph.
460
  ///
461
  /// The strongly connected components are the classes of an
462
  /// equivalence relation on the nodes of a digraph. Two nodes are in
463
  /// the same class if they are connected with directed paths in both
464
  /// direction.
431 465
  /// The strongly connected components are separated by the cut arcs.
432 466
  ///
433
  /// \param graph The graph.
434
  /// \retval cutMap A writable node map. The values will be set true when the
435
  /// arc is a cut arc.
467
  /// \param digraph The digraph.
468
  /// \retval cutMap A writable arc map. The values will be set to \c true
469
  /// for the cut arcs (exactly once for each cut arc), and will not be
470
  /// changed for other arcs.
471
  /// \return The number of cut arcs.
436 472
  ///
437
  /// \return The number of cut arcs
473
  /// \see stronglyConnected(), stronglyConnectedComponents()
438 474
  template <typename Digraph, typename ArcMap>
439
  int stronglyConnectedCutArcs(const Digraph& graph, ArcMap& cutMap) {
475
  int stronglyConnectedCutArcs(const Digraph& digraph, ArcMap& cutMap) {
440 476
    checkConcept<concepts::Digraph, Digraph>();
441 477
    typedef typename Digraph::Node Node;
442 478
    typedef typename Digraph::Arc Arc;
443 479
    typedef typename Digraph::NodeIt NodeIt;
444 480
    checkConcept<concepts::WriteMap<Arc, bool>, ArcMap>();
445 481

	
446 482
    using namespace _connectivity_bits;
447 483

	
448 484
    typedef std::vector<Node> Container;
449 485
    typedef typename Container::iterator Iterator;
450 486

	
451
    Container nodes(countNodes(graph));
487
    Container nodes(countNodes(digraph));
452 488
    typedef LeaveOrderVisitor<Digraph, Iterator> Visitor;
453 489
    Visitor visitor(nodes.begin());
454 490

	
455
    DfsVisit<Digraph, Visitor> dfs(graph, visitor);
491
    DfsVisit<Digraph, Visitor> dfs(digraph, visitor);
456 492
    dfs.init();
457
    for (NodeIt it(graph); it != INVALID; ++it) {
493
    for (NodeIt it(digraph); it != INVALID; ++it) {
458 494
      if (!dfs.reached(it)) {
459 495
        dfs.addSource(it);
460 496
        dfs.start();
461 497
      }
462 498
    }
463 499

	
464 500
    typedef typename Container::reverse_iterator RIterator;
465 501
    typedef ReverseDigraph<const Digraph> RDigraph;
466 502

	
467
    RDigraph rgraph(graph);
503
    RDigraph rdigraph(digraph);
468 504

	
469 505
    int cutNum = 0;
470 506

	
471 507
    typedef StronglyConnectedCutArcsVisitor<RDigraph, ArcMap> RVisitor;
472
    RVisitor rvisitor(rgraph, cutMap, cutNum);
508
    RVisitor rvisitor(rdigraph, cutMap, cutNum);
473 509

	
474
    DfsVisit<RDigraph, RVisitor> rdfs(rgraph, rvisitor);
510
    DfsVisit<RDigraph, RVisitor> rdfs(rdigraph, rvisitor);
475 511

	
476 512
    rdfs.init();
477 513
    for (RIterator it = nodes.rbegin(); it != nodes.rend(); ++it) {
478 514
      if (!rdfs.reached(*it)) {
479 515
        rdfs.addSource(*it);
480 516
        rdfs.start();
... ...
@@ -703,36 +739,41 @@
703 739

	
704 740
  template <typename Graph>
705 741
  int countBiNodeConnectedComponents(const Graph& graph);
706 742

	
707 743
  /// \ingroup graph_properties
708 744
  ///
709
  /// \brief Checks the graph is bi-node-connected.
745
  /// \brief Check whether an undirected graph is bi-node-connected.
710 746
  ///
711
  /// This function checks that the undirected graph is bi-node-connected
712
  /// graph. The graph is bi-node-connected if any two undirected edge is
713
  /// on same circle.
747
  /// This function checks whether the given undirected graph is 
748
  /// bi-node-connected, i.e. any two edges are on same circle.
714 749
  ///
715
  /// \param graph The graph.
716
  /// \return \c true when the graph bi-node-connected.
750
  /// \return \c true if the graph bi-node-connected.
751
  /// \note By definition, the empty graph is bi-node-connected.
752
  ///
753
  /// \see countBiNodeConnectedComponents(), biNodeConnectedComponents()
717 754
  template <typename Graph>
718 755
  bool biNodeConnected(const Graph& graph) {
719 756
    return countBiNodeConnectedComponents(graph) <= 1;
720 757
  }
721 758

	
722 759
  /// \ingroup graph_properties
723 760
  ///
724
  /// \brief Count the biconnected components.
761
  /// \brief Count the number of bi-node-connected components of an 
762
  /// undirected graph.
725 763
  ///
726
  /// This function finds the bi-node-connected components in an undirected
727
  /// graph. The biconnected components are the classes of an equivalence
728
  /// relation on the undirected edges. Two undirected edge is in relationship
729
  /// when they are on same circle.
764
  /// This function counts the number of bi-node-connected components of
765
  /// the given undirected graph.
730 766
  ///
731
  /// \param graph The graph.
732
  /// \return The number of components.
767
  /// The bi-node-connected components are the classes of an equivalence
768
  /// relation on the edges of a undirected graph. Two edges are in the
769
  /// same class if they are on same circle.
770
  ///
771
  /// \return The number of bi-node-connected components.
772
  ///
773
  /// \see biNodeConnected(), biNodeConnectedComponents()
733 774
  template <typename Graph>
734 775
  int countBiNodeConnectedComponents(const Graph& graph) {
735 776
    checkConcept<concepts::Graph, Graph>();
736 777
    typedef typename Graph::NodeIt NodeIt;
737 778

	
738 779
    using namespace _connectivity_bits;
... ...
@@ -753,28 +794,32 @@
753 794
    }
754 795
    return compNum;
755 796
  }
756 797

	
757 798
  /// \ingroup graph_properties
758 799
  ///
759
  /// \brief Find the bi-node-connected components.
800
  /// \brief Find the bi-node-connected components of an undirected graph.
760 801
  ///
761
  /// This function finds the bi-node-connected components in an undirected
762
  /// graph. The bi-node-connected components are the classes of an equivalence
763
  /// relation on the undirected edges. Two undirected edge are in relationship
764
  /// when they are on same circle.
802
  /// This function finds the bi-node-connected components of the given
803
  /// undirected graph.
804
  ///
805
  /// The bi-node-connected components are the classes of an equivalence
806
  /// relation on the edges of a undirected graph. Two edges are in the
807
  /// same class if they are on same circle.
765 808
  ///
766 809
  /// \image html node_biconnected_components.png
767 810
  /// \image latex node_biconnected_components.eps "bi-node-connected components" width=\textwidth
768 811
  ///
769
  /// \param graph The graph.
770
  /// \retval compMap A writable uedge map. The values will be set from 0
771
  /// to the number of the biconnected components minus one. Each values
772
  /// of the map will be set exactly once, the values of a certain component
773
  /// will be set continuously.
774
  /// \return The number of components.
812
  /// \param graph The undirected graph.
813
  /// \retval compMap A writable edge map. The values will be set from 0
814
  /// to the number of the bi-node-connected components minus one. Each
815
  /// value of the map will be set exactly once, and the values of a 
816
  /// certain component will be set continuously.
817
  /// \return The number of bi-node-connected components.
818
  ///
819
  /// \see biNodeConnected(), countBiNodeConnectedComponents()
775 820
  template <typename Graph, typename EdgeMap>
776 821
  int biNodeConnectedComponents(const Graph& graph,
777 822
                                EdgeMap& compMap) {
778 823
    checkConcept<concepts::Graph, Graph>();
779 824
    typedef typename Graph::NodeIt NodeIt;
780 825
    typedef typename Graph::Edge Edge;
... ...
@@ -798,24 +843,31 @@
798 843
    }
799 844
    return compNum;
800 845
  }
801 846

	
802 847
  /// \ingroup graph_properties
803 848
  ///
804
  /// \brief Find the bi-node-connected cut nodes.
849
  /// \brief Find the bi-node-connected cut nodes in an undirected graph.
805 850
  ///
806
  /// This function finds the bi-node-connected cut nodes in an undirected
807
  /// graph. The bi-node-connected components are the classes of an equivalence
808
  /// relation on the undirected edges. Two undirected edges are in
809
  /// relationship when they are on same circle. The biconnected components
810
  /// are separted by nodes which are the cut nodes of the components.
851
  /// This function finds the bi-node-connected cut nodes in the given
852
  /// undirected graph.
811 853
  ///
812
  /// \param graph The graph.
813
  /// \retval cutMap A writable edge map. The values will be set true when
814
  /// the node separate two or more components.
854
  /// The bi-node-connected components are the classes of an equivalence
855
  /// relation on the edges of a undirected graph. Two edges are in the
856
  /// same class if they are on same circle.
857
  /// The bi-node-connected components are separted by the cut nodes of
858
  /// the components.
859
  ///
860
  /// \param graph The undirected graph.
861
  /// \retval cutMap A writable node map. The values will be set to 
862
  /// \c true for the nodes that separate two or more components
863
  /// (exactly once for each cut node), and will not be changed for
864
  /// other nodes.
815 865
  /// \return The number of the cut nodes.
866
  ///
867
  /// \see biNodeConnected(), biNodeConnectedComponents()
816 868
  template <typename Graph, typename NodeMap>
817 869
  int biNodeConnectedCutNodes(const Graph& graph, NodeMap& cutMap) {
818 870
    checkConcept<concepts::Graph, Graph>();
819 871
    typedef typename Graph::Node Node;
820 872
    typedef typename Graph::NodeIt NodeIt;
821 873
    checkConcept<concepts::WriteMap<Node, bool>, NodeMap>();
... ...
@@ -1028,36 +1080,43 @@
1028 1080

	
1029 1081
  template <typename Graph>
1030 1082
  int countBiEdgeConnectedComponents(const Graph& graph);
1031 1083

	
1032 1084
  /// \ingroup graph_properties
1033 1085
  ///
1034
  /// \brief Checks that the graph is bi-edge-connected.
1086
  /// \brief Check whether an undirected graph is bi-edge-connected.
1035 1087
  ///
1036
  /// This function checks that the graph is bi-edge-connected. The undirected
1037
  /// graph is bi-edge-connected when any two nodes are connected with two
1038
  /// edge-disjoint paths.
1088
  /// This function checks whether the given undirected graph is 
1089
  /// bi-edge-connected, i.e. any two nodes are connected with at least
1090
  /// two edge-disjoint paths.
1039 1091
  ///
1040
  /// \param graph The undirected graph.
1041
  /// \return The number of components.
1092
  /// \return \c true if the graph is bi-edge-connected.
1093
  /// \note By definition, the empty graph is bi-edge-connected.
1094
  ///
1095
  /// \see countBiEdgeConnectedComponents(), biEdgeConnectedComponents()
1042 1096
  template <typename Graph>
1043 1097
  bool biEdgeConnected(const Graph& graph) {
1044 1098
    return countBiEdgeConnectedComponents(graph) <= 1;
1045 1099
  }
1046 1100

	
1047 1101
  /// \ingroup graph_properties
1048 1102
  ///
1049
  /// \brief Count the bi-edge-connected components.
1103
  /// \brief Count the number of bi-edge-connected components of an
1104
  /// undirected graph.
1050 1105
  ///
1051
  /// This function count the bi-edge-connected components in an undirected
1052
  /// graph. The bi-edge-connected components are the classes of an equivalence
1053
  /// relation on the nodes. Two nodes are in relationship when they are
1054
  /// connected with at least two edge-disjoint paths.
1106
  /// This function counts the number of bi-edge-connected components of
1107
  /// the given undirected graph.
1055 1108
  ///
1056
  /// \param graph The undirected graph.
1057
  /// \return The number of components.
1109
  /// The bi-edge-connected components are the classes of an equivalence
1110
  /// relation on the nodes of an undirected graph. Two nodes are in the
1111
  /// same class if they are connected with at least two edge-disjoint
1112
  /// paths.
1113
  ///
1114
  /// \return The number of bi-edge-connected components.
1115
  ///
1116
  /// \see biEdgeConnected(), biEdgeConnectedComponents()
1058 1117
  template <typename Graph>
1059 1118
  int countBiEdgeConnectedComponents(const Graph& graph) {
1060 1119
    checkConcept<concepts::Graph, Graph>();
1061 1120
    typedef typename Graph::NodeIt NodeIt;
1062 1121

	
1063 1122
    using namespace _connectivity_bits;
... ...
@@ -1078,28 +1137,33 @@
1078 1137
    }
1079 1138
    return compNum;
1080 1139
  }
1081 1140

	
1082 1141
  /// \ingroup graph_properties
1083 1142
  ///
1084
  /// \brief Find the bi-edge-connected components.
1143
  /// \brief Find the bi-edge-connected components of an undirected graph.
1085 1144
  ///
1086
  /// This function finds the bi-edge-connected components in an undirected
1087
  /// graph. The bi-edge-connected components are the classes of an equivalence
1088
  /// relation on the nodes. Two nodes are in relationship when they are
1089
  /// connected at least two edge-disjoint paths.
1145
  /// This function finds the bi-edge-connected components of the given
1146
  /// undirected graph.
1147
  ///
1148
  /// The bi-edge-connected components are the classes of an equivalence
1149
  /// relation on the nodes of an undirected graph. Two nodes are in the
1150
  /// same class if they are connected with at least two edge-disjoint
1151
  /// paths.
1090 1152
  ///
1091 1153
  /// \image html edge_biconnected_components.png
1092 1154
  /// \image latex edge_biconnected_components.eps "bi-edge-connected components" width=\textwidth
1093 1155
  ///
1094
  /// \param graph The graph.
1156
  /// \param graph The undirected graph.
1095 1157
  /// \retval compMap A writable node map. The values will be set from 0 to
1096
  /// the number of the biconnected components minus one. Each values
1097
  /// of the map will be set exactly once, the values of a certain component
1098
  /// will be set continuously.
1099
  /// \return The number of components.
1158
  /// the number of the bi-edge-connected components minus one. Each value
1159
  /// of the map will be set exactly once, and the values of a certain
1160
  /// component will be set continuously.
1161
  /// \return The number of bi-edge-connected components.
1162
  ///
1163
  /// \see biEdgeConnected(), countBiEdgeConnectedComponents()
1100 1164
  template <typename Graph, typename NodeMap>
1101 1165
  int biEdgeConnectedComponents(const Graph& graph, NodeMap& compMap) {
1102 1166
    checkConcept<concepts::Graph, Graph>();
1103 1167
    typedef typename Graph::NodeIt NodeIt;
1104 1168
    typedef typename Graph::Node Node;
1105 1169
    checkConcept<concepts::WriteMap<Node, int>, NodeMap>();
... ...
@@ -1122,25 +1186,31 @@
1122 1186
    }
1123 1187
    return compNum;
1124 1188
  }
1125 1189

	
1126 1190
  /// \ingroup graph_properties
1127 1191
  ///
1128
  /// \brief Find the bi-edge-connected cut edges.
1192
  /// \brief Find the bi-edge-connected cut edges in an undirected graph.
1129 1193
  ///
1130
  /// This function finds the bi-edge-connected components in an undirected
1131
  /// graph. The bi-edge-connected components are the classes of an equivalence
1132
  /// relation on the nodes. Two nodes are in relationship when they are
1133
  /// connected with at least two edge-disjoint paths. The bi-edge-connected
1134
  /// components are separted by edges which are the cut edges of the
1135
  /// components.
1194
  /// This function finds the bi-edge-connected cut edges in the given
1195
  /// undirected graph. 
1136 1196
  ///
1137
  /// \param graph The graph.
1138
  /// \retval cutMap A writable node map. The values will be set true when the
1139
  /// edge is a cut edge.
1197
  /// The bi-edge-connected components are the classes of an equivalence
1198
  /// relation on the nodes of an undirected graph. Two nodes are in the
1199
  /// same class if they are connected with at least two edge-disjoint
1200
  /// paths.
1201
  /// The bi-edge-connected components are separted by the cut edges of
1202
  /// the components.
1203
  ///
1204
  /// \param graph The undirected graph.
1205
  /// \retval cutMap A writable edge map. The values will be set to \c true
1206
  /// for the cut edges (exactly once for each cut edge), and will not be
1207
  /// changed for other edges.
1140 1208
  /// \return The number of cut edges.
1209
  ///
1210
  /// \see biEdgeConnected(), biEdgeConnectedComponents()
1141 1211
  template <typename Graph, typename EdgeMap>
1142 1212
  int biEdgeConnectedCutEdges(const Graph& graph, EdgeMap& cutMap) {
1143 1213
    checkConcept<concepts::Graph, Graph>();
1144 1214
    typedef typename Graph::NodeIt NodeIt;
1145 1215
    typedef typename Graph::Edge Edge;
1146 1216
    checkConcept<concepts::WriteMap<Edge, bool>, EdgeMap>();
... ...
@@ -1186,65 +1256,108 @@
1186 1256
    };
1187 1257

	
1188 1258
  }
1189 1259

	
1190 1260
  /// \ingroup graph_properties
1191 1261
  ///
1262
  /// \brief Check whether a digraph is DAG.
1263
  ///
1264
  /// This function checks whether the given digraph is DAG, i.e.
1265
  /// \e Directed \e Acyclic \e Graph.
1266
  /// \return \c true if there is no directed cycle in the digraph.
1267
  /// \see acyclic()
1268
  template <typename Digraph>
1269
  bool dag(const Digraph& digraph) {
1270

	
1271
    checkConcept<concepts::Digraph, Digraph>();
1272

	
1273
    typedef typename Digraph::Node Node;
1274
    typedef typename Digraph::NodeIt NodeIt;
1275
    typedef typename Digraph::Arc Arc;
1276

	
1277
    typedef typename Digraph::template NodeMap<bool> ProcessedMap;
1278

	
1279
    typename Dfs<Digraph>::template SetProcessedMap<ProcessedMap>::
1280
      Create dfs(digraph);
1281

	
1282
    ProcessedMap processed(digraph);
1283
    dfs.processedMap(processed);
1284

	
1285
    dfs.init();
1286
    for (NodeIt it(digraph); it != INVALID; ++it) {
1287
      if (!dfs.reached(it)) {
1288
        dfs.addSource(it);
1289
        while (!dfs.emptyQueue()) {
1290
          Arc arc = dfs.nextArc();
1291
          Node target = digraph.target(arc);
1292
          if (dfs.reached(target) && !processed[target]) {
1293
            return false;
1294
          }
1295
          dfs.processNextArc();
1296
        }
1297
      }
1298
    }
1299
    return true;
1300
  }
1301

	
1302
  /// \ingroup graph_properties
1303
  ///
1192 1304
  /// \brief Sort the nodes of a DAG into topolgical order.
1193 1305
  ///
1194
  /// Sort the nodes of a DAG into topolgical order.
1306
  /// This function sorts the nodes of the given acyclic digraph (DAG)
1307
  /// into topolgical order.
1195 1308
  ///
1196
  /// \param graph The graph. It must be directed and acyclic.
1309
  /// \param digraph The digraph, which must be DAG.
1197 1310
  /// \retval order A writable node map. The values will be set from 0 to
1198
  /// the number of the nodes in the graph minus one. Each values of the map
1199
  /// will be set exactly once, the values  will be set descending order.
1311
  /// the number of the nodes in the digraph minus one. Each value of the
1312
  /// map will be set exactly once, and the values will be set descending
1313
  /// order.
1200 1314
  ///
1201
  /// \see checkedTopologicalSort
1202
  /// \see dag
1315
  /// \see dag(), checkedTopologicalSort()
1203 1316
  template <typename Digraph, typename NodeMap>
1204
  void topologicalSort(const Digraph& graph, NodeMap& order) {
1317
  void topologicalSort(const Digraph& digraph, NodeMap& order) {
1205 1318
    using namespace _connectivity_bits;
1206 1319

	
1207 1320
    checkConcept<concepts::Digraph, Digraph>();
1208 1321
    checkConcept<concepts::WriteMap<typename Digraph::Node, int>, NodeMap>();
1209 1322

	
1210 1323
    typedef typename Digraph::Node Node;
1211 1324
    typedef typename Digraph::NodeIt NodeIt;
1212 1325
    typedef typename Digraph::Arc Arc;
1213 1326

	
1214 1327
    TopologicalSortVisitor<Digraph, NodeMap>
1215
      visitor(order, countNodes(graph));
1328
      visitor(order, countNodes(digraph));
1216 1329

	
1217 1330
    DfsVisit<Digraph, TopologicalSortVisitor<Digraph, NodeMap> >
1218
      dfs(graph, visitor);
1331
      dfs(digraph, visitor);
1219 1332

	
1220 1333
    dfs.init();
1221
    for (NodeIt it(graph); it != INVALID; ++it) {
1334
    for (NodeIt it(digraph); it != INVALID; ++it) {
1222 1335
      if (!dfs.reached(it)) {
1223 1336
        dfs.addSource(it);
1224 1337
        dfs.start();
1225 1338
      }
1226 1339
    }
1227 1340
  }
1228 1341

	
1229 1342
  /// \ingroup graph_properties
1230 1343
  ///
1231 1344
  /// \brief Sort the nodes of a DAG into topolgical order.
1232 1345
  ///
1233
  /// Sort the nodes of a DAG into topolgical order. It also checks
1234
  /// that the given graph is DAG.
1346
  /// This function sorts the nodes of the given acyclic digraph (DAG)
1347
  /// into topolgical order and also checks whether the given digraph
1348
  /// is DAG.
1235 1349
  ///
1236
  /// \param digraph The graph. It must be directed and acyclic.
1237
  /// \retval order A readable - writable node map. The values will be set
1238
  /// from 0 to the number of the nodes in the graph minus one. Each values
1239
  /// of the map will be set exactly once, the values will be set descending
1240
  /// order.
1241
  /// \return \c false when the graph is not DAG.
1350
  /// \param digraph The digraph.
1351
  /// \retval order A readable and writable node map. The values will be
1352
  /// set from 0 to the number of the nodes in the digraph minus one. 
1353
  /// Each value of the map will be set exactly once, and the values will
1354
  /// be set descending order.
1355
  /// \return \c false if the digraph is not DAG.
1242 1356
  ///
1243
  /// \see topologicalSort
1244
  /// \see dag
1357
  /// \see dag(), topologicalSort()
1245 1358
  template <typename Digraph, typename NodeMap>
1246 1359
  bool checkedTopologicalSort(const Digraph& digraph, NodeMap& order) {
1247 1360
    using namespace _connectivity_bits;
1248 1361

	
1249 1362
    checkConcept<concepts::Digraph, Digraph>();
1250 1363
    checkConcept<concepts::ReadWriteMap<typename Digraph::Node, int>,
... ...
@@ -1280,108 +1393,66 @@
1280 1393
    }
1281 1394
    return true;
1282 1395
  }
1283 1396

	
1284 1397
  /// \ingroup graph_properties
1285 1398
  ///
1286
  /// \brief Check that the given directed graph is a DAG.
1399
  /// \brief Check whether an undirected graph is acyclic.
1287 1400
  ///
1288
  /// Check that the given directed graph is a DAG. The DAG is
1289
  /// an Directed Acyclic Digraph.
1290
  /// \return \c false when the graph is not DAG.
1291
  /// \see acyclic
1292
  template <typename Digraph>
1293
  bool dag(const Digraph& digraph) {
1294

	
1295
    checkConcept<concepts::Digraph, Digraph>();
1296

	
1297
    typedef typename Digraph::Node Node;
1298
    typedef typename Digraph::NodeIt NodeIt;
1299
    typedef typename Digraph::Arc Arc;
1300

	
1301
    typedef typename Digraph::template NodeMap<bool> ProcessedMap;
1302

	
1303
    typename Dfs<Digraph>::template SetProcessedMap<ProcessedMap>::
1304
      Create dfs(digraph);
1305

	
1306
    ProcessedMap processed(digraph);
1307
    dfs.processedMap(processed);
1308

	
1309
    dfs.init();
1310
    for (NodeIt it(digraph); it != INVALID; ++it) {
1311
      if (!dfs.reached(it)) {
1312
        dfs.addSource(it);
1313
        while (!dfs.emptyQueue()) {
1314
          Arc edge = dfs.nextArc();
1315
          Node target = digraph.target(edge);
1316
          if (dfs.reached(target) && !processed[target]) {
1317
            return false;
1318
          }
1319
          dfs.processNextArc();
1320
        }
1321
      }
1322
    }
1323
    return true;
1324
  }
1325

	
1326
  /// \ingroup graph_properties
1327
  ///
1328
  /// \brief Check that the given undirected graph is acyclic.
1329
  ///
1330
  /// Check that the given undirected graph acyclic.
1331
  /// \param graph The undirected graph.
1332
  /// \return \c true when there is no circle in the graph.
1333
  /// \see dag
1401
  /// This function checks whether the given undirected graph is acyclic.
1402
  /// \return \c true if there is no cycle in the graph.
1403
  /// \see dag()
1334 1404
  template <typename Graph>
1335 1405
  bool acyclic(const Graph& graph) {
1336 1406
    checkConcept<concepts::Graph, Graph>();
1337 1407
    typedef typename Graph::Node Node;
1338 1408
    typedef typename Graph::NodeIt NodeIt;
1339 1409
    typedef typename Graph::Arc Arc;
1340 1410
    Dfs<Graph> dfs(graph);
1341 1411
    dfs.init();
1342 1412
    for (NodeIt it(graph); it != INVALID; ++it) {
1343 1413
      if (!dfs.reached(it)) {
1344 1414
        dfs.addSource(it);
1345 1415
        while (!dfs.emptyQueue()) {
1346
          Arc edge = dfs.nextArc();
1347
          Node source = graph.source(edge);
1348
          Node target = graph.target(edge);
1416
          Arc arc = dfs.nextArc();
1417
          Node source = graph.source(arc);
1418
          Node target = graph.target(arc);
1349 1419
          if (dfs.reached(target) &&
1350
              dfs.predArc(source) != graph.oppositeArc(edge)) {
1420
              dfs.predArc(source) != graph.oppositeArc(arc)) {
1351 1421
            return false;
1352 1422
          }
1353 1423
          dfs.processNextArc();
1354 1424
        }
1355 1425
      }
1356 1426
    }
1357 1427
    return true;
1358 1428
  }
1359 1429

	
1360 1430
  /// \ingroup graph_properties
1361 1431
  ///
1362
  /// \brief Check that the given undirected graph is tree.
1432
  /// \brief Check whether an undirected graph is tree.
1363 1433
  ///
1364
  /// Check that the given undirected graph is tree.
1365
  /// \param graph The undirected graph.
1366
  /// \return \c true when the graph is acyclic and connected.
1434
  /// This function checks whether the given undirected graph is tree.
1435
  /// \return \c true if the graph is acyclic and connected.
1436
  /// \see acyclic(), connected()
1367 1437
  template <typename Graph>
1368 1438
  bool tree(const Graph& graph) {
1369 1439
    checkConcept<concepts::Graph, Graph>();
1370 1440
    typedef typename Graph::Node Node;
1371 1441
    typedef typename Graph::NodeIt NodeIt;
1372 1442
    typedef typename Graph::Arc Arc;
1443
    if (NodeIt(graph) == INVALID) return true;
1373 1444
    Dfs<Graph> dfs(graph);
1374 1445
    dfs.init();
1375 1446
    dfs.addSource(NodeIt(graph));
1376 1447
    while (!dfs.emptyQueue()) {
1377
      Arc edge = dfs.nextArc();
1378
      Node source = graph.source(edge);
1379
      Node target = graph.target(edge);
1448
      Arc arc = dfs.nextArc();
1449
      Node source = graph.source(arc);
1450
      Node target = graph.target(arc);
1380 1451
      if (dfs.reached(target) &&
1381
          dfs.predArc(source) != graph.oppositeArc(edge)) {
1452
          dfs.predArc(source) != graph.oppositeArc(arc)) {
1382 1453
        return false;
1383 1454
      }
1384 1455
      dfs.processNextArc();
1385 1456
    }
1386 1457
    for (NodeIt it(graph); it != INVALID; ++it) {
1387 1458
      if (!dfs.reached(it)) {
... ...
@@ -1448,21 +1519,20 @@
1448 1519
      bool& _bipartite;
1449 1520
    };
1450 1521
  }
1451 1522

	
1452 1523
  /// \ingroup graph_properties
1453 1524
  ///
1454
  /// \brief Check if the given undirected graph is bipartite or not
1525
  /// \brief Check whether an undirected graph is bipartite.
1455 1526
  ///
1456
  /// The function checks if the given undirected \c graph graph is bipartite
1457
  /// or not. The \ref Bfs algorithm is used to calculate the result.
1458
  /// \param graph The undirected graph.
1459
  /// \return \c true if \c graph is bipartite, \c false otherwise.
1460
  /// \sa bipartitePartitions
1527
  /// The function checks whether the given undirected graph is bipartite.
1528
  /// \return \c true if the graph is bipartite.
1529
  ///
1530
  /// \see bipartitePartitions()
1461 1531
  template<typename Graph>
1462
  inline bool bipartite(const Graph &graph){
1532
  bool bipartite(const Graph &graph){
1463 1533
    using namespace _connectivity_bits;
1464 1534

	
1465 1535
    checkConcept<concepts::Graph, Graph>();
1466 1536

	
1467 1537
    typedef typename Graph::NodeIt NodeIt;
1468 1538
    typedef typename Graph::ArcIt ArcIt;
... ...
@@ -1485,31 +1555,33 @@
1485 1555
    }
1486 1556
    return true;
1487 1557
  }
1488 1558

	
1489 1559
  /// \ingroup graph_properties
1490 1560
  ///
1491
  /// \brief Check if the given undirected graph is bipartite or not
1561
  /// \brief Find the bipartite partitions of an undirected graph.
1492 1562
  ///
1493
  /// The function checks if the given undirected graph is bipartite
1494
  /// or not. The  \ref  Bfs  algorithm  is   used  to  calculate the result.
1495
  /// During the execution, the \c partMap will be set as the two
1496
  /// partitions of the graph.
1563
  /// This function checks whether the given undirected graph is bipartite
1564
  /// and gives back the bipartite partitions.
1497 1565
  ///
1498 1566
  /// \image html bipartite_partitions.png
1499 1567
  /// \image latex bipartite_partitions.eps "Bipartite partititions" width=\textwidth
1500 1568
  ///
1501 1569
  /// \param graph The undirected graph.
1502
  /// \retval partMap A writable bool map of nodes. It will be set as the
1503
  /// two partitions of the graph.
1504
  /// \return \c true if \c graph is bipartite, \c false otherwise.
1570
  /// \retval partMap A writable node map of \c bool (or convertible) value
1571
  /// type. The values will be set to \c true for one component and
1572
  /// \c false for the other one.
1573
  /// \return \c true if the graph is bipartite, \c false otherwise.
1574
  ///
1575
  /// \see bipartite()
1505 1576
  template<typename Graph, typename NodeMap>
1506
  inline bool bipartitePartitions(const Graph &graph, NodeMap &partMap){
1577
  bool bipartitePartitions(const Graph &graph, NodeMap &partMap){
1507 1578
    using namespace _connectivity_bits;
1508 1579

	
1509 1580
    checkConcept<concepts::Graph, Graph>();
1581
    checkConcept<concepts::WriteMap<typename Graph::Node, bool>, NodeMap>();
1510 1582

	
1511 1583
    typedef typename Graph::Node Node;
1512 1584
    typedef typename Graph::NodeIt NodeIt;
1513 1585
    typedef typename Graph::ArcIt ArcIt;
1514 1586

	
1515 1587
    bool bipartite = true;
... ...
@@ -1528,59 +1600,65 @@
1528 1600
        }
1529 1601
      }
1530 1602
    }
1531 1603
    return true;
1532 1604
  }
1533 1605

	
1534
  /// \brief Returns true when there are not loop edges in the graph.
1606
  /// \ingroup graph_properties
1535 1607
  ///
1536
  /// Returns true when there are not loop edges in the graph.
1537
  template <typename Digraph>
1538
  bool loopFree(const Digraph& digraph) {
1539
    for (typename Digraph::ArcIt it(digraph); it != INVALID; ++it) {
1540
      if (digraph.source(it) == digraph.target(it)) return false;
1608
  /// \brief Check whether the given graph contains no loop arcs/edges.
1609
  ///
1610
  /// This function returns \c true if there are no loop arcs/edges in
1611
  /// the given graph. It works for both directed and undirected graphs.
1612
  template <typename Graph>
1613
  bool loopFree(const Graph& graph) {
1614
    for (typename Graph::ArcIt it(graph); it != INVALID; ++it) {
1615
      if (graph.source(it) == graph.target(it)) return false;
1541 1616
    }
1542 1617
    return true;
1543 1618
  }
1544 1619

	
1545
  /// \brief Returns true when there are not parallel edges in the graph.
1620
  /// \ingroup graph_properties
1546 1621
  ///
1547
  /// Returns true when there are not parallel edges in the graph.
1548
  template <typename Digraph>
1549
  bool parallelFree(const Digraph& digraph) {
1550
    typename Digraph::template NodeMap<bool> reached(digraph, false);
1551
    for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
1552
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1553
        if (reached[digraph.target(a)]) return false;
1554
        reached.set(digraph.target(a), true);
1622
  /// \brief Check whether the given graph contains no parallel arcs/edges.
1623
  ///
1624
  /// This function returns \c true if there are no parallel arcs/edges in
1625
  /// the given graph. It works for both directed and undirected graphs.
1626
  template <typename Graph>
1627
  bool parallelFree(const Graph& graph) {
1628
    typename Graph::template NodeMap<int> reached(graph, 0);
1629
    int cnt = 1;
1630
    for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1631
      for (typename Graph::OutArcIt a(graph, n); a != INVALID; ++a) {
1632
        if (reached[graph.target(a)] == cnt) return false;
1633
        reached[graph.target(a)] = cnt;
1555 1634
      }
1556
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1557
        reached.set(digraph.target(a), false);
1558
      }
1635
      ++cnt;
1559 1636
    }
1560 1637
    return true;
1561 1638
  }
1562 1639

	
1563
  /// \brief Returns true when there are not loop edges and parallel
1564
  /// edges in the graph.
1640
  /// \ingroup graph_properties
1565 1641
  ///
1566
  /// Returns true when there are not loop edges and parallel edges in
1567
  /// the graph.
1568
  template <typename Digraph>
1569
  bool simpleDigraph(const Digraph& digraph) {
1570
    typename Digraph::template NodeMap<bool> reached(digraph, false);
1571
    for (typename Digraph::NodeIt n(digraph); n != INVALID; ++n) {
1572
      reached.set(n, true);
1573
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1574
        if (reached[digraph.target(a)]) return false;
1575
        reached.set(digraph.target(a), true);
1642
  /// \brief Check whether the given graph is simple.
1643
  ///
1644
  /// This function returns \c true if the given graph is simple, i.e.
1645
  /// it contains no loop arcs/edges and no parallel arcs/edges.
1646
  /// The function works for both directed and undirected graphs.
1647
  /// \see loopFree(), parallelFree()
1648
  template <typename Graph>
1649
  bool simpleGraph(const Graph& graph) {
1650
    typename Graph::template NodeMap<int> reached(graph, 0);
1651
    int cnt = 1;
1652
    for (typename Graph::NodeIt n(graph); n != INVALID; ++n) {
1653
      reached[n] = cnt;
1654
      for (typename Graph::OutArcIt a(graph, n); a != INVALID; ++a) {
1655
        if (reached[graph.target(a)] == cnt) return false;
1656
        reached[graph.target(a)] = cnt;
1576 1657
      }
1577
      for (typename Digraph::OutArcIt a(digraph, n); a != INVALID; ++a) {
1578
        reached.set(digraph.target(a), false);
1579
      }
1580
      reached.set(n, false);
1658
      ++cnt;
1581 1659
    }
1582 1660
    return true;
1583 1661
  }
1584 1662

	
1585 1663
} //namespace lemon
1586 1664

	
Ignore white space 12 line context
... ...
@@ -241,16 +241,16 @@
241 241
      ++(*this);
242 242
      return e;
243 243
    }
244 244
  };
245 245

	
246 246

	
247
  ///Check if the given graph is \e Eulerian
247
  ///Check if the given graph is Eulerian
248 248

	
249 249
  /// \ingroup graph_properties
250
  ///This function checks if the given graph is \e Eulerian.
250
  ///This function checks if the given graph is Eulerian.
251 251
  ///It works for both directed and undirected graphs.
252 252
  ///
253 253
  ///By definition, a digraph is called \e Eulerian if
254 254
  ///and only if it is connected and the number of incoming and outgoing
255 255
  ///arcs are the same for each node.
256 256
  ///Similarly, an undirected graph is called \e Eulerian if
Ignore white space 12 line context
... ...
@@ -6,12 +6,13 @@
6 6
LINK_DIRECTORIES(${PROJECT_BINARY_DIR}/lemon)
7 7

	
8 8
SET(TESTS
9 9
  adaptors_test
10 10
  bfs_test
11 11
  circulation_test
12
  connectivity_test
12 13
  counter_test
13 14
  dfs_test
14 15
  digraph_test
15 16
  dijkstra_test
16 17
  dim_test
17 18
  edge_set_test
Ignore white space 12 line context
... ...
@@ -6,12 +6,13 @@
6 6
	test/test_tools.h
7 7

	
8 8
check_PROGRAMS += \
9 9
	test/adaptors_test \
10 10
	test/bfs_test \
11 11
	test/circulation_test \
12
	test/connectivity_test \
12 13
	test/counter_test \
13 14
	test/dfs_test \
14 15
	test/digraph_test \
15 16
	test/dijkstra_test \
16 17
	test/dim_test \
17 18
	test/edge_set_test \
... ...
@@ -51,12 +52,13 @@
51 52
XFAIL_TESTS += test/test_tools_fail$(EXEEXT)
52 53

	
53 54
test_adaptors_test_SOURCES = test/adaptors_test.cc
54 55
test_bfs_test_SOURCES = test/bfs_test.cc
55 56
test_circulation_test_SOURCES = test/circulation_test.cc
56 57
test_counter_test_SOURCES = test/counter_test.cc
58
test_connectivity_test_SOURCES = test/connectivity_test.cc
57 59
test_dfs_test_SOURCES = test/dfs_test.cc
58 60
test_digraph_test_SOURCES = test/digraph_test.cc
59 61
test_dijkstra_test_SOURCES = test/dijkstra_test.cc
60 62
test_dim_test_SOURCES = test/dim_test.cc
61 63
test_edge_set_test_SOURCES = test/edge_set_test.cc
62 64
test_error_test_SOURCES = test/error_test.cc
0 comments (0 inline)