My Project
ComponentsLoop.h
Go to the documentation of this file.
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
 All Classes Files Functions Variables Typedefs