[Lemon-commits] [lemon_svn] deba: r2343 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:51:56 CET 2006
Author: deba
Date: Wed Nov 16 10:10:24 2005
New Revision: 2343
Modified:
hugo/trunk/lemon/topology.h
Log:
bipartite by szakall
Modified: hugo/trunk/lemon/topology.h
==============================================================================
--- hugo/trunk/lemon/topology.h (original)
+++ hugo/trunk/lemon/topology.h Wed Nov 16 10:10:24 2005
@@ -480,13 +480,13 @@
namespace _topology_bits {
template <typename Graph>
- class CountNodeBiconnectedComponentsVisitor : public DfsVisitor<Graph> {
+ class CountBiNodeConnectedComponentsVisitor : public DfsVisitor<Graph> {
public:
typedef typename Graph::Node Node;
typedef typename Graph::Edge Edge;
typedef typename Graph::UndirEdge UndirEdge;
- CountNodeBiconnectedComponentsVisitor(const Graph& graph, int &compNum)
+ CountBiNodeConnectedComponentsVisitor(const Graph& graph, int &compNum)
: _graph(graph), _compNum(compNum),
_numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
@@ -538,13 +538,13 @@
};
template <typename Graph, typename EdgeMap>
- class NodeBiconnectedComponentsVisitor : public DfsVisitor<Graph> {
+ class BiNodeConnectedComponentsVisitor : public DfsVisitor<Graph> {
public:
typedef typename Graph::Node Node;
typedef typename Graph::Edge Edge;
typedef typename Graph::UndirEdge UndirEdge;
- NodeBiconnectedComponentsVisitor(const Graph& graph,
+ BiNodeConnectedComponentsVisitor(const Graph& graph,
EdgeMap& compMap, int &compNum)
: _graph(graph), _compMap(compMap), _compNum(compNum),
_numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
@@ -618,13 +618,13 @@
template <typename Graph, typename NodeMap>
- class NodeBiconnectedCutNodesVisitor : public DfsVisitor<Graph> {
+ class BiNodeConnectedCutNodesVisitor : public DfsVisitor<Graph> {
public:
typedef typename Graph::Node Node;
typedef typename Graph::Edge Edge;
typedef typename Graph::UndirEdge UndirEdge;
- NodeBiconnectedCutNodesVisitor(const Graph& graph, NodeMap& cutMap,
+ BiNodeConnectedCutNodesVisitor(const Graph& graph, NodeMap& cutMap,
int& cutNum)
: _graph(graph), _cutMap(cutMap), _cutNum(cutNum),
_numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
@@ -696,7 +696,7 @@
}
template <typename UndirGraph>
- int countNodeBiconnectedComponents(const UndirGraph& graph);
+ int countBiNodeConnectedComponents(const UndirGraph& graph);
/// \ingroup topology
///
@@ -711,7 +711,7 @@
/// \todo Make it faster.
template <typename UndirGraph>
bool biNodeConnected(const UndirGraph& graph) {
- return countNodeBiconnectedComponents(graph) == 1;
+ return countBiNodeConnectedComponents(graph) == 1;
}
/// \ingroup topology
@@ -726,13 +726,13 @@
/// \param graph The graph.
/// \return The number of components.
template <typename UndirGraph>
- int countNodeBiconnectedComponents(const UndirGraph& graph) {
+ int countBiNodeConnectedComponents(const UndirGraph& graph) {
checkConcept<concept::UndirGraph, UndirGraph>();
typedef typename UndirGraph::NodeIt NodeIt;
using namespace _topology_bits;
- typedef CountNodeBiconnectedComponentsVisitor<UndirGraph> Visitor;
+ typedef CountBiNodeConnectedComponentsVisitor<UndirGraph> Visitor;
int compNum = 0;
Visitor visitor(graph, compNum);
@@ -778,7 +778,7 @@
using namespace _topology_bits;
- typedef NodeBiconnectedComponentsVisitor<UndirGraph, UndirEdgeMap> Visitor;
+ typedef BiNodeConnectedComponentsVisitor<UndirGraph, UndirEdgeMap> Visitor;
int compNum = 0;
Visitor visitor(graph, compMap, compNum);
@@ -818,7 +818,7 @@
using namespace _topology_bits;
- typedef NodeBiconnectedCutNodesVisitor<UndirGraph, NodeMap> Visitor;
+ typedef BiNodeConnectedCutNodesVisitor<UndirGraph, NodeMap> Visitor;
int cutNum = 0;
Visitor visitor(graph, cutMap, cutNum);
@@ -838,13 +838,13 @@
namespace _topology_bits {
template <typename Graph>
- class CountEdgeBiconnectedComponentsVisitor : public DfsVisitor<Graph> {
+ class CountBiEdgeConnectedComponentsVisitor : public DfsVisitor<Graph> {
public:
typedef typename Graph::Node Node;
typedef typename Graph::Edge Edge;
typedef typename Graph::UndirEdge UndirEdge;
- CountEdgeBiconnectedComponentsVisitor(const Graph& graph, int &compNum)
+ CountBiEdgeConnectedComponentsVisitor(const Graph& graph, int &compNum)
: _graph(graph), _compNum(compNum),
_numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
@@ -894,13 +894,13 @@
};
template <typename Graph, typename NodeMap>
- class EdgeBiconnectedComponentsVisitor : public DfsVisitor<Graph> {
+ class BiEdgeConnectedComponentsVisitor : public DfsVisitor<Graph> {
public:
typedef typename Graph::Node Node;
typedef typename Graph::Edge Edge;
typedef typename Graph::UndirEdge UndirEdge;
- EdgeBiconnectedComponentsVisitor(const Graph& graph,
+ BiEdgeConnectedComponentsVisitor(const Graph& graph,
NodeMap& compMap, int &compNum)
: _graph(graph), _compMap(compMap), _compNum(compNum),
_numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
@@ -961,13 +961,13 @@
template <typename Graph, typename EdgeMap>
- class EdgeBiconnectedCutEdgesVisitor : public DfsVisitor<Graph> {
+ class BiEdgeConnectedCutEdgesVisitor : public DfsVisitor<Graph> {
public:
typedef typename Graph::Node Node;
typedef typename Graph::Edge Edge;
typedef typename Graph::UndirEdge UndirEdge;
- EdgeBiconnectedCutEdgesVisitor(const Graph& graph,
+ BiEdgeConnectedCutEdgesVisitor(const Graph& graph,
EdgeMap& cutMap, int &cutNum)
: _graph(graph), _cutMap(cutMap), _cutNum(cutNum),
_numMap(graph), _retMap(graph), _predMap(graph), _num(0) {}
@@ -1023,7 +1023,7 @@
}
template <typename UndirGraph>
- int countEdgeBiconnectedComponents(const UndirGraph& graph);
+ int countbiEdgeConnectedComponents(const UndirGraph& graph);
/// \ingroup topology
///
@@ -1038,7 +1038,7 @@
/// \todo Make it faster.
template <typename UndirGraph>
bool biEdgeConnected(const UndirGraph& graph) {
- return countEdgeBiconnectedComponents(graph) == 1;
+ return countBiEdgeConnectedComponents(graph) == 1;
}
/// \ingroup topology
@@ -1053,13 +1053,13 @@
/// \param graph The undirected graph.
/// \return The number of components.
template <typename UndirGraph>
- int countEdgeBiconnectedComponents(const UndirGraph& graph) {
+ int countBiEdgeConnectedComponents(const UndirGraph& graph) {
checkConcept<concept::UndirGraph, UndirGraph>();
typedef typename UndirGraph::NodeIt NodeIt;
using namespace _topology_bits;
- typedef CountEdgeBiconnectedComponentsVisitor<UndirGraph> Visitor;
+ typedef CountBiEdgeConnectedComponentsVisitor<UndirGraph> Visitor;
int compNum = 0;
Visitor visitor(graph, compNum);
@@ -1104,7 +1104,7 @@
using namespace _topology_bits;
- typedef EdgeBiconnectedComponentsVisitor<UndirGraph, NodeMap> Visitor;
+ typedef BiEdgeConnectedComponentsVisitor<UndirGraph, NodeMap> Visitor;
int compNum = 0;
Visitor visitor(graph, compMap, compNum);
@@ -1145,7 +1145,7 @@
using namespace _topology_bits;
- typedef EdgeBiconnectedCutEdgesVisitor<UndirGraph, UndirEdgeMap> Visitor;
+ typedef BiEdgeConnectedCutEdgesVisitor<UndirGraph, UndirEdgeMap> Visitor;
int cutNum = 0;
Visitor visitor(graph, cutMap, cutNum);
@@ -1388,41 +1388,76 @@
/// \ingroup topology
///
- /// \brief Check that the given undirected graph is bipartite.
+ /// \brief Check if the given undirected graph is bipartite or not
///
- /// Check that the given undirected graph is bipartite.
+ /// The function checks if the given undirected \c graph graph is bipartite
+ /// or not. The \ref Bfs algorithm is used to calculate the result.
/// \param graph The undirected graph.
- /// \return %True when the nodes can be separated into two sets that
- /// there are not connected nodes in neither sets.
- template <typename UndirGraph>
- bool bipartite(const UndirGraph& graph) {
+ /// \return %True if \c graph is bipartite, %false otherwise.
+ /// \sa bipartitePartitions
+ ///
+ /// \author Balazs Attila Mihaly
+ template<typename UndirGraph>
+ inline bool bipartite(const UndirGraph &graph){
+ checkConcept<concept::UndirGraph, UndirGraph>();
+
+ typedef typename UndirGraph::NodeIt NodeIt;
+ typedef typename UndirGraph::EdgeIt EdgeIt;
+
+ Bfs<UndirGraph> bfs(graph);
+ bfs.init();
+ for(NodeIt i(graph);i!=INVALID;++i){
+ if(!bfs.reached(i)){
+ bfs.run(i);
+ }
+ }
+ for(EdgeIt i(graph);i!=INVALID;++i){
+ if(bfs.dist(graph.source(i))==bfs.dist(graph.target(i)))return false;
+ }
+ return true;
+ };
+
+ /// \ingroup topology
+ ///
+ /// \brief Check if the given undirected graph is bipartite or not
+ ///
+ /// The function checks if the given undirected graph is bipartite
+ /// or not. The \ref Bfs algorithm is used to calculate the result.
+ /// During the execution, the \c partMap will be set as the two
+ /// partitions of the graph.
+ /// \param graph The undirected graph.
+ /// \retval partMap A writeable bool map of nodes. It will be set as the
+ /// two partitions of the graph.
+ /// \return %True if \c graph is bipartite, %false otherwise.
+ ///
+ /// \author Balazs Attila Mihaly
+ ///
+ /// \image html bipartite_partitions.png
+ /// \image latex bipartite_partitions.eps "Bipartite partititions" width=\textwidth
+ template<typename UndirGraph, typename NodeMap>
+ inline bool bipartitePartitions(const UndirGraph &graph, NodeMap &partMap){
checkConcept<concept::UndirGraph, UndirGraph>();
+
typedef typename UndirGraph::Node Node;
typedef typename UndirGraph::NodeIt NodeIt;
- typedef typename UndirGraph::Edge Edge;
- if (NodeIt(graph) == INVALID) return false;
- Dfs<UndirGraph> dfs(graph);
- dfs.init();
- typename UndirGraph::template NodeMap<bool> red(graph);
- for (NodeIt it(graph); it != INVALID; ++it) {
- if (!dfs.reached(it)) {
- dfs.addSource(it);
- red[it] = true;
- while (!dfs.emptyQueue()) {
- Edge edge = dfs.nextEdge();
- Node source = graph.source(edge);
- Node target = graph.target(edge);
- if (dfs.reached(target) && red[source] == red[target]) {
- return false;
- } else {
- red[target] = !red[source];
- }
- dfs.processNextEdge();
+ typedef typename UndirGraph::EdgeIt EdgeIt;
+
+ Bfs<UndirGraph> bfs(graph);
+ bfs.init();
+ for(NodeIt i(graph);i!=INVALID;++i){
+ if(!bfs.reached(i)){
+ bfs.addSource(i);
+ for(Node j=bfs.processNextNode();!bfs.emptyQueue();
+ j=bfs.processNextNode()){
+ partMap.set(j,bfs.dist(j)%2==0);
}
}
}
+ for(EdgeIt i(graph);i!=INVALID;++i){
+ if(bfs.dist(graph.source(i)) == bfs.dist(graph.target(i)))return false;
+ }
return true;
- }
+ };
} //namespace lemon
More information about the Lemon-commits
mailing list