topsort.c
Upload User: gzelex
Upload Date: 2007-01-07
Package Size: 707k
Code Size: 1k
Development Platform:

MultiPlatform

  1. #include <LEDA/graph.h>
  2. #include <LEDA/graph_edit.h>
  3. bool TOPSORT(const graph& G, node_array<int>& ord)
  4.   node_array<int> cur_indeg(G);
  5.   list<node> zero_indeg;
  6.   int count = 0;
  7.   node v,w;
  8.   forall_nodes(v,G) 
  9.   { cur_indeg[v] = G.indeg(v);
  10.     if (G.indeg(v)==0) 
  11.        zero_indeg.append(v); 
  12.    }
  13.   while ( ! zero_indeg.empty() )
  14.   { 
  15.     count++;
  16.     v = zero_indeg.pop();
  17.   
  18.     ord[v] = count;
  19.     forall_adj_nodes(w,v) 
  20.        if (--cur_indeg[w]==0) zero_indeg.append(w);
  21.    }
  22.   
  23.   return (count==G.number_of_nodes());
  24. }
  25.      
  26. main()
  27. {
  28.   GRAPH<point,int>  G;
  29.   window W;
  30.   for(;;)
  31.   { 
  32.     graph_edit(W,G);
  33.     node_array<int> node_num(G);
  34.     if (TOPSORT(G,node_num)==false)
  35.     { W.acknowledge("Graph is cyclic, cannot sort");
  36.       continue;
  37.      }
  38.     node v;
  39.     forall_nodes(v,G)
  40.        W.draw_int_node(G[v],node_num[v],blue);
  41.    if (W.read_mouse() == 3) break;
  42.   }
  43.   return 0;
  44. }