src/biu/Graph_UD.cc
Go to the documentation of this file.00001 #include "Graph_UD.hh"
00002
00003 #include <stack>
00004 #include "assertbiu.hh"
00005 #include <limits.h>
00006
00007
00008 namespace biu
00009 {
00010
00011 Graph_UD::Graph_UD( size_t nodeNumber)
00012 : adjList(nodeNumber)
00013 {
00014 }
00015
00016 Graph_UD::~Graph_UD()
00017 {
00018 }
00019
00020 void
00021 Graph_UD::addEdge(const size_t n1, const size_t n2) {
00022 assertbiu(std::max(n1,n2) < adjList.size(), "node index out of range");
00023 adjList[n1].insert(n2);
00024 adjList[n2].insert(n1);
00025 }
00026
00027 void
00028 Graph_UD::remEdge(const size_t n1, const size_t n2) {
00029 assertbiu(std::max(n1,n2) < adjList.size(), "node index out of range");
00030 adjList[n1].erase(n2);
00031 adjList[n2].erase(n1);
00032 }
00033
00034 bool
00035 Graph_UD::isEdge(const size_t n1, const size_t n2) {
00036 assertbiu(std::max(n1,n2) < adjList.size(), "node index out of range");
00037 return adjList[n1].find(n2) != adjList[n1].end();
00038 }
00039
00040 size_t
00041 Graph_UD::nodes(void) const {
00042 return adjList.size();
00043 }
00044
00045 size_t
00046 Graph_UD::edges(void) const {
00047 size_t num = 0;
00048 for(size_t i = 0; i< adjList.size(); i++) {
00049 num += adjList[i].size();
00050 }
00051 return num/2;
00052 }
00053
00054 size_t
00055 Graph_UD::degree(const size_t n) const {
00056 return adjList[n].size();
00057 }
00058
00059 size_t
00060 Graph_UD::connectedComponents( Graph_UD::CompLabel & compID ) const {
00061
00062 compID.resize(adjList.size());
00063
00064 if (adjList.size() == 0)
00065 return 0;
00066
00067 for (Graph_UD::CompLabel::iterator it1 = compID.begin(); it1!=compID.end(); it1++) {
00068 *it1 = UINT_MAX;
00069 }
00070
00071 size_t curLabel = 0;
00072 size_t lastInitID = 0;
00073
00074
00075 do {
00076
00077 labelAdjacentNodes(lastInitID, compID, curLabel);
00078
00079 for (lastInitID++; lastInitID < compID.size() && compID[lastInitID] != UINT_MAX; lastInitID++);
00080
00081 curLabel++;
00082 } while (lastInitID < adjList.size());
00083
00084 return curLabel;
00085 }
00086
00087
00088 void
00089 Graph_UD::labelAdjacentNodes( const size_t curNode, Graph_UD::CompLabel & compID, const size_t label) const {
00090 assertbiu( curNode < compID.size() , "initial node out of node index range");
00091 if (compID[curNode] != UINT_MAX)
00092 return;
00093
00094 typedef std::set<size_t>::const_iterator adjIT;
00095 std::stack<adjIT> path;
00096 compID[curNode] = label;
00097
00098 if (adjList[curNode].empty())
00099 return;
00100 else
00101 path.push( adjList[curNode].begin() );
00102
00103 while ( !path.empty() ) {
00104 if ( compID[*path.top()] == UINT_MAX) {
00105 compID[*path.top()] = label;
00106 if ( ! adjList[*path.top()].empty() )
00107 path.push( adjList[*path.top()].begin() );
00108 } else {
00109 adjIT t = path.top();
00110 path.pop();
00111 t++;
00112
00113 if ( (path.empty() && t != adjList[curNode].end()) ||
00114 (!path.empty() && t != adjList[*path.top()].end()) ) {
00115 path.push(t);
00116 }
00117 }
00118 }
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 void
00138 Graph_UD::printDOT( std::ostream & out ) const {
00139 size_t i = 0;
00140
00141 out <<"graph G {\n";
00142
00143 for (i=0; i<nodes(); i++)
00144 out <<" "<<i <<";";
00145 out <<"\n";
00146
00147 for (i=0; i<nodes(); i++)
00148 for (std::set<size_t>::const_iterator it = adjList[i].begin(); it != adjList[i].end(); it++)
00149 if (i <= (*it))
00150 out <<" " <<i <<"--" <<(*it) <<";\n";
00151
00152 out <<"}";
00153 }
00154
00155 void
00156 Graph_UD::setNodeNumber(const size_t max) {
00157
00158 adjList.resize(max);
00159
00160 for (size_t i=0; i< adjList.size(); i++) {
00161 adjList[i].erase(adjList[i].find(max), adjList[i].end());
00162 }
00163 }
00164
00165 Graph_UD::AdjItPair
00166 Graph_UD::adjNodes( const size_t n ) const
00167 {
00168 return AdjItPair(adjList[n].begin(), adjList[n].end());
00169 }
00170
00171
00172 }