Home | Documentation | Download | Platforms | Projects | Mailing Lists | Version History
00001 //========================================================================== 00002 // 00003 // graph.h 00004 // 00005 //========================================================================== 00006 // $Id: graph.h,v 1.43 2002/11/06 08:49:35 raitner Exp $ 00007 00008 #ifndef GTL_GRAPH_H 00009 #define GTL_GRAPH_H 00010 00011 #include <GTL/GTL.h> 00012 #include <GTL/node.h> 00013 #include <GTL/edge.h> 00014 #include <GTL/edge_map.h> 00015 #include <GTL/node_map.h> 00016 #include <GTL/gml_parser.h> 00017 00018 #include <iostream> 00019 #include <string> 00020 00021 __GTL_BEGIN_NAMESPACE 00022 00041 class GTL_EXTERN graph 00042 { 00043 public: 00044 //================================================== Con-/Destructors 00045 00049 graph(); 00050 00062 graph (const graph& G); 00063 00073 graph (const graph& G, const list<node>& nodes); 00074 00085 graph (const graph& G, 00086 list<node>::const_iterator it, 00087 list<node>::const_iterator end); 00088 00092 virtual ~graph(); 00093 00094 //================================================== Directed/Undirected 00095 00099 void make_directed(); 00100 00104 void make_undirected(); 00105 00106 //================================================== Tests / Information 00107 00113 bool is_directed() const; 00114 00120 bool is_undirected() const; 00121 00133 bool is_bidirected(edge_map<edge>& rev) const; 00134 00142 bool is_connected() const; 00143 00150 bool is_acyclic() const; 00151 00157 int number_of_nodes() const; 00158 00164 int number_of_edges() const; 00165 00172 node center() const; 00173 00174 //================================================== Creation 00175 00181 virtual node new_node(); 00182 00194 virtual edge new_edge(node s, node t); 00195 00199 virtual edge new_edge(const list<node> &sources, const list<node> &targets); 00200 00201 //================================================== Deletion 00202 00213 void del_node(node n); 00214 00219 void del_all_nodes(); 00220 00230 void del_edge(edge e); 00231 00236 void del_all_edges(); 00237 00241 void clear(); 00242 00243 //================================================== Iterators 00244 00248 typedef list<node>::const_iterator node_iterator; 00252 typedef list<edge>::const_iterator edge_iterator; 00253 00259 node_iterator nodes_begin() const; 00260 00266 node_iterator nodes_end() const; 00267 00273 edge_iterator edges_begin() const; 00274 00280 edge_iterator edges_end() const; 00281 00282 //================================================== get nodes/edges 00283 00288 list<node> all_nodes() const; 00289 00294 list<edge> all_edges() const; 00295 00299 node choose_node () const; 00300 00301 //================================================== Hide / Restore 00302 00311 void hide_edge (edge e); 00312 00321 void restore_edge (edge e); 00322 00334 list<edge> hide_node (node n); 00335 00346 void restore_node (node n); 00347 00359 void induced_subgraph (list<node>& subgraph_nodes); 00360 00371 void restore_graph (); 00372 00373 //================================================== Others 00374 00380 list<edge> insert_reverse_edges(); 00381 00382 //================================================== I/O 00383 00400 GML_error load (const string& filename, bool preserve_ids = false) 00401 { return load (filename.c_str(), preserve_ids); } 00402 00403 00420 GML_error load (const char* filename, bool preserve_ids = false); 00421 00430 int save (const char* filename) const; 00431 00438 void save (ostream* file = &cout) const; 00439 00440 //================================================== Node handlers 00441 00448 virtual void pre_new_node_handler() {} 00449 00457 virtual void post_new_node_handler(node n) {} 00458 00466 virtual void pre_del_node_handler(node n) {} 00467 00474 virtual void post_del_node_handler() {} 00475 00483 virtual void pre_hide_node_handler(node n) {} 00484 00492 virtual void post_hide_node_handler(node n) {} 00493 00501 virtual void pre_restore_node_handler(node n) {} 00502 00510 virtual void post_restore_node_handler(node n) {} 00511 00512 //================================================== Edge handlers 00513 00522 virtual void pre_new_edge_handler(node s, node t) {} 00523 00531 virtual void post_new_edge_handler(edge e) {} 00532 00540 virtual void pre_del_edge_handler(edge e) {} 00541 00550 virtual void post_del_edge_handler(node, node) {} 00551 00559 virtual void pre_hide_edge_handler(edge e) {} 00560 00568 virtual void post_hide_edge_handler(edge e) {} 00569 00577 virtual void pre_restore_edge_handler(edge e) {} 00578 00586 virtual void post_restore_edge_handler(edge e) {} 00587 00588 //================================================== Global handlers 00589 00600 virtual void pre_clear_handler() {} 00601 00612 virtual void post_clear_handler() {} 00613 00621 virtual void pre_make_directed_handler() {} 00622 00630 virtual void post_make_directed_handler() {} 00631 00639 virtual void pre_make_undirected_handler() {} 00640 00648 virtual void post_make_undirected_handler() {} 00649 00650 00651 //================================================== I/O - Handler 00652 00661 virtual void pre_graph_save_handler (ostream* os) const { }; 00662 00672 virtual void save_graph_info_handler (ostream*) const { }; 00673 00683 virtual void save_node_info_handler (ostream*, node) const { }; 00684 00694 virtual void save_edge_info_handler (ostream*, edge) const { }; 00695 00704 virtual void after_graph_save_handler (ostream* ) const { }; 00705 00715 virtual void top_level_key_handler (GML_pair* list); 00716 00727 virtual void load_node_info_handler (node n, GML_pair* list ); 00728 00739 virtual void load_edge_info_handler (edge e, GML_pair* list); 00740 00749 virtual void load_graph_info_handler (GML_pair* list); 00750 00751 private: 00752 00753 //================================================== Flags 00754 00755 mutable bool directed; 00756 00757 //================================================== Visible Nodes/Edges 00758 00759 list<node> nodes; 00760 list<edge> edges; 00761 int nodes_count, edges_count; 00762 00763 //================================================== Hidden Nodes/Edges 00764 00765 list<node> hidden_nodes; 00766 list<edge> hidden_edges; 00767 int hidden_nodes_count, hidden_edges_count; 00768 00769 //================================================== Node/edge numbering 00770 00771 int new_node_id(); 00772 int new_edge_id(); 00773 00774 //================================================== Copy 00775 00776 void copy (const graph& G, 00777 list<node>::const_iterator it, 00778 list<node>::const_iterator end); 00779 00780 public: // needs to be public, because template friends are not possible 00784 int number_of_ids(node) const; 00785 00789 int number_of_ids(edge) const; 00790 00791 private: 00792 list<int> free_node_ids; 00793 list<int> free_edge_ids; 00794 int free_node_ids_count, free_edge_ids_count; 00795 00796 //================================================== utilities 00797 00798 void del_list(list<node> &); 00799 void del_list(list<edge> &); 00800 00801 GTL_EXTERN friend ostream& operator<< (ostream& os, const graph& G); 00802 }; 00803 00804 __GTL_END_NAMESPACE 00805 00806 //-------------------------------------------------------------------------- 00807 // Iteration 00808 //-------------------------------------------------------------------------- 00809 00810 #define forall_nodes(v,g) GTL_FORALL(v,g,graph::node_iterator,nodes_) 00811 #define forall_edges(v,g) GTL_FORALL(v,g,graph::edge_iterator,edges_) 00812 00813 #endif // GTL_GRAPH_H 00814 00815 //-------------------------------------------------------------------------- 00816 // end of file 00817 //--------------------------------------------------------------------------
University of Passau - FMI - Theoretical Computer Science