graph_to_tree.H

00001 
00002 /*
00003   This file is part of Aleph system
00004 
00005   Copyright (c) 2002, 2003, 2004, 2005, 2006
00006   UNIVERSITY LOS ANDES (ULA) Merida - REPÚBLICA BOLIVARIANA DE VENEZUELA  
00007 
00008   - Center of Studies in Microelectronics & Distributed Systems (CEMISID) 
00009   - ULA Computer Science Department
00010   - FUNDACITE Mérida - Ministerio de Ciencia y Tecnología
00011 
00012   PERMISSION TO USE, COPY, MODIFY AND DISTRIBUTE THIS SOFTWARE AND ITS
00013   DOCUMENTATION IS HEREBY GRANTED, PROVIDED THAT BOTH THE COPYRIGHT
00014   NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES OF THE
00015   SOFTWARE, DERIVATIVE WORKS OR MODIFIED VERSIONS, AND ANY PORTIONS
00016   THEREOF, AND THAT BOTH NOTICES APPEAR IN SUPPORTING DOCUMENTATION.
00017 
00018   Aleph is distributed in the hope that it will be useful, but WITHOUT
00019   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00020   or FITNESS FOR A PARTICULAR PURPOSE.
00021 
00022   UNIVERSIDAD DE LOS ANDES requests users of this software to return to 
00023 
00024   Leandro Leon
00025   CEMISID 
00026   Ed La Hechicera 
00027   3er piso, ala sur
00028   Facultad de Ingenieria 
00029   Universidad de Los Andes 
00030   Merida - REPÚBLICA BOLIVARIANA DE VENEZUELA    or
00031 
00032   lrleon@ula.ve
00033 
00034   any improvements or extensions that they make and grant Universidad 
00035   de Los Andes (ULA) the rights to redistribute these changes. 
00036 
00037   Aleph is (or was) granted by: 
00038   - Consejo de Desarrollo Cientifico, Humanistico, Tecnico de la ULA 
00039     (CDCHT)
00040   - Fundacite Mérida
00041 */
00042 
00043 
00044 # ifndef GRAPH_TO_TREE_H
00045 # define GRAPH_TO_TREE_H
00046 
00047 # include <tpl_tree_node.H>
00048 # include <tpl_graph.H>
00049 # include <tpl_graph_utils.H>
00050 
00051 namespace Aleph
00052 {
00053 
00054     template <typename GT, typename Key, class Convert> static
00055 Tree_Node<Key> * graph_to_tree_node(GT & g, typename GT::Node * groot);
00056     template <typename GT, typename Key, class Convert> static void 
00057 __graph_to_tree_node(GT & g, typename GT::Node * groot, Tree_Node<Key> * troot);
00126     template <typename GT, typename Key, class Convert> inline
00127 Tree_Node<Key> * graph_to_tree_node(GT & g, typename GT::Node * groot)
00128 { 
00129 
00130   if (not Aleph::is_acyclique(g))
00131     throw std::domain_error("Graph is not a tree (not acyclique)");
00132 
00133   Tree_Node<Key> * troot = new Tree_Node<Key>; // apartar memoria para raíz
00134 
00135   Convert () (groot, troot); //convertir de groot y copiar a troot
00136 
00137       // llamada recursiva que construye el Tree_Node<Key>
00138   __graph_to_tree_node <GT, Key, Convert> (g, groot, troot);
00139 
00140   return troot;
00141 }
00142     template <typename GT, typename Key, typename Convert> static
00143 void __graph_to_tree_node(GT &                g, 
00144                           typename GT::Node * groot,
00145                           Tree_Node<Key> *    troot)
00146 {           
00147   typedef typename GT::Node_Arc_Iterator Iterator;
00148   typedef typename GT::Node Node;
00149   typedef typename GT::Arc Arc;
00150 
00151       // recorrer arcos de groot y construir recursivamente
00152   for (Iterator it(groot); it.has_current(); it.next())
00153     {
00154       Arc * arc = it.get_current_arc();
00155 
00156       if (IS_ARC_VISITED(arc, Convert_Tree))
00157         continue;
00158 
00159       ARC_BITS(arc).set_bit(Convert_Tree, true); // marcar visitado arc 
00160 
00161       Node * gtgt = it.get_tgt_node();
00162 
00163       Tree_Node<Key> * ttgt = new Tree_Node<Key>; // crear nuevo nodo
00164 
00165       Convert () (gtgt, ttgt); // asignarle la clave
00166 
00167       troot->insert_rightmost_child(ttgt); // insertarlo como hijo 
00168 
00169       __graph_to_tree_node <GT, Key, Convert> (g, gtgt, ttgt);
00170     }
00171 }
00172 
00173 } // end namespace Aleph
00174 
00175 # endif // GRAPH_TO_TREE_H
00176 

Leandro R. León