# HG changeset patch # User Alpar Juttner # Date 1376050047 -7200 # Node ID 9eac00ea588fc2ee25ca47759d0a1c426171a2b1 # Parent 4000b7ef4e0104ecb1801bf6cf116ca5dc32c056# Parent 70b199792735c034825047537cef0250c8fb28df Merge bugfix #439 diff -r 4000b7ef4e01 -r 9eac00ea588f lemon/connectivity.h --- a/lemon/connectivity.h Thu Mar 28 14:52:43 2013 +0100 +++ b/lemon/connectivity.h Fri Aug 09 14:07:27 2013 +0200 @@ -745,14 +745,37 @@ /// \brief Check whether an undirected graph is bi-node-connected. /// /// This function checks whether the given undirected graph is - /// bi-node-connected, i.e. any two edges are on same circle. + /// bi-node-connected, i.e. a connected graph without articulation + /// node. /// /// \return \c true if the graph bi-node-connected. - /// \note By definition, the empty graph is bi-node-connected. + /// + /// \note By definition, + /// \li a graph consisting of zero or one node is bi-node-connected, + /// \li a graph consisting of two isolated nodes + /// is \e not bi-node-connected and + /// \li a graph consisting of two nodes connected by an edge + /// is bi-node-connected. /// /// \see countBiNodeConnectedComponents(), biNodeConnectedComponents() template bool biNodeConnected(const Graph& graph) { + bool hasNonIsolated = false, hasIsolated = false; + for (typename Graph::NodeIt n(graph); n != INVALID; ++n) { + if (typename Graph::OutArcIt(graph, n) == INVALID) { + if (hasIsolated || hasNonIsolated) { + return false; + } else { + hasIsolated = true; + } + } else { + if (hasIsolated) { + return false; + } else { + hasNonIsolated = true; + } + } + } return countBiNodeConnectedComponents(graph) <= 1; } diff -r 4000b7ef4e01 -r 9eac00ea588f test/connectivity_test.cc --- a/test/connectivity_test.cc Thu Mar 28 14:52:43 2013 +0100 +++ b/test/connectivity_test.cc Fri Aug 09 14:07:27 2013 +0200 @@ -99,6 +99,23 @@ } { + ListGraph g; + ListGraph::NodeMap map(g); + + ListGraph::Node n1 = g.addNode(); + ListGraph::Node n2 = g.addNode(); + + ListGraph::Edge e1 = g.addEdge(n1, n2); + ::lemon::ignore_unused_variable_warning(e1); + check(biNodeConnected(g), "Graph is bi-node-connected"); + + ListGraph::Node n3 = g.addNode(); + ::lemon::ignore_unused_variable_warning(n3); + check(!biNodeConnected(g), "Graph is not bi-node-connected"); + } + + + { Digraph d; Digraph::NodeMap order(d); Graph g(d);