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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _topsort.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. /*******************************************************************************
  12. *                                                                              *
  13. *  TOPSORT (topological sorting)                                               *
  14. *                                                                              *
  15. *******************************************************************************/
  16. #include <LEDA/graph_alg.h>
  17. bool TOPSORT(const graph& G, node_array<int>& ord)
  18.   node_array<int> INDEG(G,0);
  19.   node_list ZEROINDEG;
  20.   int count=0;
  21.   node v,w;
  22.   forall_nodes(v,G) if ((INDEG[v]=indeg(v))==0) ZEROINDEG.append(v); 
  23.   while (!ZEROINDEG.empty())
  24.    { v = ZEROINDEG.pop();
  25.      ord[v] = ++count;
  26.      forall_adj_nodes(w,v) 
  27.         if (--INDEG[w]==0) ZEROINDEG.append(w);
  28.     }
  29.   
  30.   if (count==G.number_of_nodes()) 
  31.      return(true);
  32.   else 
  33.      return(false);
  34. }
  35.      
  36. // TOPSORT1 rearrange nodes and edges 
  37. bool TOPSORT1(graph& G)
  38.   if (G.number_of_nodes()==0 || G.number_of_edges()==0) return true;
  39.   node_array<int> node_ord(G);
  40.   edge_array<int> edge_ord(G);
  41.   if (TOPSORT(G,node_ord))
  42.    { edge e;
  43.      forall_edges(e,G) edge_ord[e] = node_ord[target(e)];
  44.      G.sort_nodes(node_ord);
  45.      G.sort_edges(edge_ord);
  46.      return true;
  47.     }
  48.   else return false;
  49.   
  50. }
  51.