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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _components.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. *  COMPONENTS  (connected components)                                          *
  14. *                                                                              *
  15. *******************************************************************************/
  16. #include <LEDA/graph_alg.h>
  17. #include <LEDA/node_partition.h>
  18. #include <LEDA/stack.h>
  19. static int count;
  20. static void dfs(const graph& G, node v, node_array<int>& compnum)
  21.   stack<node>  S;
  22.   S.push(v);
  23.   compnum[v] = count;
  24.   while (!S.empty())
  25.    { v = S.pop(); 
  26.      edge e;
  27.      forall_inout_edges(e,v) 
  28.      { node w = G.opposite(v,e);
  29.         if (compnum[w] == -1)
  30.         { compnum[w] = count;
  31.           S.push(w);
  32.          }
  33.       }
  34.     }
  35.  
  36. int COMPONENTS(const graph& G, node_array<int>& compnum)
  37. { // computes the connected components of the underlying undirected graph
  38.   // compnum[v] = i  iff v in component i
  39.   // number of components is returned
  40.   node v;
  41.   forall_nodes(v,G) compnum[v] = -1;
  42.   count = 0;
  43.   forall_nodes(v,G) 
  44.     if (compnum[v] == -1) 
  45.     { dfs(G,v,compnum);
  46.       count++; 
  47.      }
  48.   return count;
  49. }
  50. int COMPONENTS1(const graph& G, node_array<int>& compnum)
  51.   // an alternative implementation using node partitions (union-find)
  52.   node_partition P(G);
  53.   edge e;
  54.   node v;
  55.   forall_nodes(v,G) compnum[v] = -1;
  56.   forall_edges(e,G) P.union_blocks(source(e),target(e));
  57.   int count = 0;
  58.   forall_nodes(v,G) 
  59.    { node w = P.find(v);
  60.      if (compnum[w]==-1) compnum[w] = count++;
  61.      compnum[v] = compnum[w];
  62.     }
  63.   return count;
  64. }