• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

depth_first_search.cc

00001 // Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #include <iostream>
00027 #include <mln/util/graph.hh>
00028 #include <mln/util/array.hh>
00029 
00030 #include <mln/canvas/browsing/depth_first_search.hh>
00031 
00032 struct Functor
00033 {
00034   template <typename G> void init(const mln::Graph<G>& g)
00035   {
00036     deja_vu_.resize(exact(g).v_nmax());
00037     deja_vu_.fill(false);
00038     order.resize(0);
00039   }
00040 
00041   bool to_be_treated(unsigned id)
00042   {
00043     return !deja_vu_[id];
00044   }
00045 
00046   void new_component_from_vertex(unsigned id)
00047   {
00048     deja_vu_[id] = true;
00049   }
00050 
00051   void process_vertex(unsigned id)
00052   {
00053     order.append(id);
00054   }
00055 
00056   bool to_be_queued(unsigned id)
00057   {
00058     return !deja_vu_[id];
00059   }
00060 
00061   void added_to_queue(unsigned id)
00062   {
00063     deja_vu_[id] = true;
00064   }
00065 
00066   void next_component()
00067   {
00068   }
00069 
00070   void final()
00071   {
00072   }
00073 
00074   mln::util::array<unsigned> order;
00075   mln::util::array<bool> deja_vu_;
00076 };
00077 
00078 int main()
00079 {
00080   using namespace mln;
00081 
00082   typedef util::graph G;
00083   G g;
00084   g.add_vertices(5);
00085   g.add_edge(0,4);
00086   g.add_edge(1,2);
00087   g.add_edge(1,3);
00088   g.add_edge(4,3);
00089   g.add_edge(4,2);
00090 
00091   unsigned result[] = {0, 4, 2, 1, 3};
00092   Functor f;
00093 
00094   canvas::browsing::depth_first_search(g, f);
00095 
00096   for (unsigned i = 0; i < f.order.size(); ++i)
00097     mln_assertion(f.order[i] == result[i]);
00098 }

Generated on Tue Oct 4 2011 15:23:41 for Milena (Olena) by  doxygen 1.7.1