_g_sort.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _g_sort.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/graph.h>
  12. //--------------------------------------------------------------------------
  13. // sorting
  14. //--------------------------------------------------------------------------
  15. static const graph_map*  NA;
  16. static graph* GGG;
  17. static int array_cmp_nodes(const node& x, const node& y) 
  18. { return NA->cmp_entry(NA->array_read(x),NA->array_read(y)); }
  19. static int array_cmp_edges(const edge& x, const edge& y) 
  20. { return NA->cmp_entry(NA->array_read(x),NA->array_read(y)); }
  21. static int graph_cmp_nodes(const node& x, const node& y)
  22. { return GGG->cmp_node_entry(x,y); }
  23. static int graph_cmp_edges(const edge& x, const edge& y)
  24. { return GGG->cmp_edge_entry(x,y); }
  25. static int (*CMP_NODES)(const node&, const node&);
  26. static int (*CMP_EDGES)(const edge&, const edge&);
  27. static int CMP_ADJ_LINKS(obj_link* p, obj_link* q)
  28. { edge e1 = edge(adj_link1(p));
  29.   edge e2 = edge(adj_link1(q));
  30.   return CMP_EDGES(e1,e2);
  31.  }
  32. /*
  33. static int CMP_ADJ_LINKS1(obj_link* p, obj_link* q)
  34. { edge e1 = edge(adj_link2(p));
  35.   edge e2 = edge(adj_link2(q));
  36.   return CMP_EDGES(e1,e2);
  37.  }
  38. */
  39. static int CMP_EDGE_LINKS(obj_link* p, obj_link* q)
  40. { edge e1 = edge(edge_link(p));
  41.   edge e2 = edge(edge_link(q));
  42.   return CMP_EDGES(e1,e2);
  43.  }
  44. static int CMP_NODE_LINKS(obj_link* p, obj_link* q)
  45. { node u = node(node_link(p));
  46.   node v = node(node_link(q));
  47.   return CMP_NODES(u,v);
  48.  }
  49.    
  50. void graph::sort_nodes(int (*f)(const node&, const node&))
  51. { CMP_NODES = f;
  52.   V.sort(CMP_NODE_LINKS); 
  53.  }
  54. void graph::sort_edges(int (*f)(const edge&, const edge&))
  55. { CMP_EDGES = f;
  56.   E.sort(CMP_EDGE_LINKS);
  57.   node v;
  58.   forall_nodes(v,*this) 
  59.   { v->adj_edges[0].sort(CMP_ADJ_LINKS);
  60.     //v->adj_edges[1].sort(CMP_ADJ_LINKS1);
  61.    }
  62.  }
  63. void graph::sort_nodes(const graph_map& A) 
  64. { NA = &A; 
  65.   sort_nodes(array_cmp_nodes); 
  66.  }
  67. void graph::sort_edges(const graph_map& A) 
  68. { NA = &A; 
  69.   sort_edges(array_cmp_edges); 
  70.  }
  71. void graph::sort_nodes() 
  72. { GGG = this; 
  73.   sort_nodes(graph_cmp_nodes); 
  74.  }
  75. void graph::sort_edges() 
  76. { GGG = this; 
  77.   sort_edges(graph_cmp_edges); 
  78.  }