dfs.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:2k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* $Id: dfs.c,v 1.1 1996/10/04 13:36:32 calvert Exp $
  2.  *
  3.  * dfs.c -- simple dfs program and routine that uses dfs to check connectivity
  4.  *
  5.  * Uses the Stanford GraphBase tools.
  6.  */
  7. #include <stdio.h>
  8. #ifndef FBSD
  9. #include <alloca.h>
  10. #endif
  11. #include <sys/types.h>
  12. #include "gb_graph.h"
  13. #include "math.h"
  14. #include "geog.h"
  15. #define STACKMAX 0x600
  16. static char dfsID[]="$Id: dfs.c,v 1.1 1996/10/04 13:36:32 calvert Exp $";
  17. #define NBBY 8
  18. /* check connectivity of graph g                        */
  19. /* uses depth-first search.                             */
  20. isconnected(Graph *G)
  21. {
  22. u_char *vis;
  23. Vertex *vp;
  24. int i,nbytes;
  25.     nbytes = (G->n/NBBY)+ (G->n%NBBY?1:0);
  26.     if (nbytes < STACKMAX) { /* for small amounts we use stack frame */
  27.         vis = (u_char *) alloca(nbytes);
  28.     } else {
  29.         vis = (u_char *) malloc(nbytes);
  30.     }
  31.     for (i=0; i<nbytes; i++) vis[i]=0;
  32.     i =  (dfs(G,0,vis)==G->n);
  33.     if (nbytes >= STACKMAX) free(vis);
  34.     return i;
  35. }
  36. #define bitset(v,i)     (v[(i)/NBBY]&(1<<((i)%NBBY)))
  37. #define setbit(v,i)     v[(i)/NBBY] |= (1<<((i)%NBBY))
  38. /* trivial depth-first search. */
  39. /* Returns number of newly-visited nodes in subtree rooted at node n. */
  40. int
  41. dfs(Graph *G,int n,u_char *vis)
  42. {
  43. int nvis, i, nextn;
  44. Vertex *vp;
  45. Arc *ap;
  46.     setbit(vis,n);       /* mark this node as visited */
  47.     vp = G->vertices + n;
  48.     nvis = 1;           /* nvis == number of nodes visited */
  49.     for (ap=vp->arcs; ap; ap=ap->next) {
  50.          nextn = ap->tip - G->vertices;
  51.         if (!bitset(vis,nextn)) {  /* not seen yet */
  52.             nvis += dfs(G,nextn,vis);
  53.         }
  54.     }
  55.     return nvis;
  56. } /* dfs */