My Project
|
00001 #ifndef COMPLOOP_H 00002 #define COMPLOOP_H 00003 00010 #include "MyTools.h" 00011 00020 template <typename T, typename K> 00021 bool ForEachComponent(map <T, map <T, K> >* graph, bool (*func)(map <T, map < T, K > >* Component, void* instance), void* MyInstance) 00022 { 00023 /* Get neighbors 00024 * The given graph is undirected, so neighbors only go in one direction */ 00025 typename map < T, map <T, K> >::iterator it_gr; 00026 typename map < T, K >::iterator it_fri; 00027 map < T, vector < T > > neighbors; 00028 typename map < T, vector < T > >::iterator it_nei, it_n; 00029 00030 for (it_gr = graph->begin(); it_gr != graph->end(); it_gr++){ 00031 for (it_fri = (it_gr->second).begin(); it_fri != (it_gr->second).end(); it_fri++){ 00032 if ((it_nei = neighbors.find(it_gr->first)) != neighbors.end()){ 00033 (it_nei->second).push_back(it_fri->first); 00034 } else { 00035 vector <T> temp; 00036 temp.push_back(it_fri->first); 00037 neighbors.insert(make_pair<T, vector <T> >(it_gr->first, temp)); 00038 } 00039 00040 if ((it_nei = neighbors.find(it_fri->first)) != neighbors.end()){ 00041 it_nei->second.push_back(it_gr->first); 00042 } else { 00043 vector <T> temp; 00044 temp.push_back(it_gr->first); 00045 neighbors.insert(make_pair<T, vector <T> >(it_fri->first, temp)); 00046 } 00047 } 00048 } 00049 00050 /*Use neighbor map to go through each connected component (each vertex can only be in one)*/ 00051 set <T> seen; 00052 typename set <T>::iterator it_seen; 00053 set <T> consider; 00054 typename set <T>::iterator it_con; 00055 for (it_nei = neighbors.begin(); it_nei != neighbors.end(); it_nei++){ 00056 if (seen.find(it_nei->first) != seen.end()) 00057 continue; 00058 00059 consider.clear(); 00060 consider.insert(it_nei->first); 00061 map <T, map <T, K> > Component; 00062 00063 while (!consider.empty()){ 00064 T current = *(consider.begin()); 00065 consider.erase(consider.begin()); 00066 seen.insert(current); 00067 if ((it_gr = graph->find(current)) != graph->end()) 00068 Component.insert(make_pair< T, map < T, K > > (it_gr->first, it_gr->second)); 00069 00070 if((it_n = neighbors.find(current)) == neighbors.end()) 00071 { 00072 cerr << "Problem retrieving next node for component." << endl; 00073 } 00074 00075 for (sui i = 0; i < it_n->second.size(); i++){ 00076 if (seen.find((it_n->second)[i]) == seen.end()) 00077 consider.insert((it_n->second)[i]); 00078 } 00079 } 00080 00081 /*Call the function*/ 00082 if (!(*func)(&Component, MyInstance)) 00083 return false; 00084 } 00085 00086 return true; 00087 } 00088 00089 #endif