graph_objects.h
Upload User: gzelex
Upload Date: 2007-01-07
Package Size: 707k
Code Size: 5k
Development Platform:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  graph_objects.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_GRAPH_OBJECTS_H
  12. #define LEDA_GRAPH_OBJECTS_H
  13. #include <LEDA/impl/olist.h>
  14. class node_struct;
  15. typedef node_struct* node;
  16. class edge_struct;
  17. typedef edge_struct* edge;
  18. class adj_link_struct1 : public obj_link {};
  19. typedef adj_link_struct1* adj_link1;
  20. class adj_link_struct2 : public obj_link {};
  21. typedef adj_link_struct2* adj_link2;
  22. class node_link_struct : public obj_link {};
  23. typedef node_link_struct* node_link;
  24. class edge_link_struct : public obj_link {};
  25. typedef edge_link_struct* edge_link;
  26. class aux_link_struct : public obj_link {};
  27. typedef aux_link_struct* aux_link;
  28. //------------------------------------------------------------------------------
  29. // class node_struct: internal representation of nodes
  30. //------------------------------------------------------------------------------
  31. class node_struct : public aux_link_struct,  // used for node_list
  32.                     public node_link_struct  // chaining all nodes
  33. {  
  34.    friend class graph;
  35.    friend class ugraph;
  36.    friend class planar_map;
  37.    friend class node_list;
  38.    //friend template<int n> class b_node_pq;
  39.    //friend template<class I> class node_pq;
  40.    
  41.    graph*    g;             // pointer to graph of node 
  42.    int       name;          // internal name (index)  
  43.    obj_list  adj_edges[2];  // lists of adjacent and incoming edges
  44.    edge      adj_iterator;  //
  45. public:
  46.    GenPtr data[3];      // data[0]: GRAPH
  47.                         // data[1]: node_pq
  48.                         // data[2]: node_partition
  49.    node_struct(GenPtr i=0) 
  50.    { data[0] = i; name = -1; g = nil; adj_iterator = nil; }
  51. LEDA_MEMORY(node_struct)
  52. friend inline graph* graph_of(node);
  53. friend inline graph* graph_of(edge);
  54. friend inline int    indeg(node);
  55. friend inline int    outdeg(node);
  56. friend inline int    degree(node);
  57. friend inline int    index(node);
  58. friend inline edge   First_Adj_Edge(node,int);
  59. friend inline edge   Last_Adj_Edge(node,int);
  60. friend void init_node_data(const graph&,int,GenPtr);
  61. };
  62. //------------------------------------------------------------------------------
  63. // class edge_struct: internal representation of edges
  64. //------------------------------------------------------------------------------
  65. class edge_struct : public adj_link_struct1,  // chaining of adjacent out-edges
  66.                     public adj_link_struct2,  // chaining of adjacent in-edges
  67.                     public edge_link_struct   // chaining of all edges
  68.    friend class graph;
  69.    friend class ugraph;
  70.    friend class planar_map;
  71.    int  name;          // internal name (index)  
  72.    node s;             // source node 
  73.    node t;             // target node
  74.    edge rev;           // space for reverse edge (used by planar_map)
  75.    GenPtr data[1];     // space for data (data[0] used by GRAPH)
  76.    edge_struct(node v, node w, GenPtr i=0)
  77.    { data[0] = i;
  78.      name = -1;
  79.      s = v;
  80.      t = w;
  81.    }
  82. public:
  83. LEDA_MEMORY(edge_struct)
  84. friend inline graph* graph_of(edge);
  85. friend inline node   source(edge);
  86. friend inline node   opposite(node,edge);
  87. friend inline node   target(edge);
  88. friend inline int    index(edge);
  89. };
  90. inline int    outdeg(node v) { return v->adj_edges[0].length(); }
  91. inline int    indeg(node v)  { return v->adj_edges[1].length(); }
  92. inline int    degree(node v) { return indeg(v) + outdeg(v); }
  93. inline int    index(node v)    { return v->name;    }
  94. inline graph* graph_of(node v) { return v->g; }
  95. inline graph* graph_of(edge e) { return e->s->g;   }
  96. inline node   source(edge e)   { return e->s;      }
  97. inline node   opposite(node v, edge e) { return (v==e->s) ? e->t : e->s; }
  98. inline node   target(edge e)   { return e->t;      }
  99. inline int    index(edge e)    { return e->name;    }
  100. // parameterized access of adjacent edges (portable code?)
  101. // outgoing (i=0) or incoming (i=1) edges
  102. inline edge First_Adj_Edge(node v, int i)  
  103. { GenPtr p = v->adj_edges[i].first() - i;
  104.   return edge(p); }
  105. inline edge Last_Adj_Edge(node v, int i)  
  106. { GenPtr p = v->adj_edges[i].last() - i;
  107.   return edge(p); }
  108. inline edge Succ_Adj_Edge(edge e, int i) 
  109. { GenPtr p = ((obj_link*)(((obj_link*)GenPtr(e))+i))->succ_item() - i;
  110.   return edge(p); }
  111. inline edge Pred_Adj_Edge(edge e, int i) 
  112. { GenPtr p = ((obj_link*)(((obj_link*)GenPtr(e))+i))->pred_item() - i;
  113.   return edge(p); }
  114. inline edge Leda_Nil_Edge(int i) 
  115. { GenPtr p = (obj_link*)0 - i;
  116.   return edge(p); }
  117. #endif