home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 200-299 / ff299.lzh / Yacc / warshall.c < prev    next >
C/C++ Source or Header  |  1989-12-30  |  1KB  |  88 lines

  1. #include "defs.h"
  2.  
  3. transitive_closure(R, n)
  4. unsigned *R;
  5. int n;
  6. {
  7.   register int rowsize;
  8.   register unsigned mask;
  9.   register unsigned *rowj;
  10.   register unsigned *rp;
  11.   register unsigned *rend;
  12.   register unsigned *ccol;
  13.  
  14.   unsigned *relend;
  15.   unsigned *cword;
  16.   unsigned *rowi;
  17.  
  18.   rowsize = ROWSIZE(n);
  19.   relend = (unsigned *) ((unsigned) R + n*rowsize);
  20.  
  21.   cword = R;
  22.   mask = 1;
  23.   rowi = R;
  24.   while (rowi < relend)
  25.     {
  26.       ccol = cword;
  27.       rowj = R;
  28.  
  29.       while (rowj < relend)
  30.     {
  31.       if (*ccol & mask)
  32.         {
  33.           rp = rowi;
  34.           rend = (unsigned *) ((unsigned) rowj + rowsize);
  35.  
  36.           while (rowj < rend)
  37.         *rowj++ |= *rp++;
  38.         }
  39.       else
  40.         {
  41.           rowj = (unsigned *) ((unsigned) rowj + rowsize);
  42.         }
  43.  
  44.       ccol = (unsigned *) ((unsigned) ccol + rowsize);
  45.     }
  46.  
  47.       mask <<= 1;
  48.       if (mask == 0)
  49.     {
  50.       mask = 1;
  51.       cword++;
  52.     }
  53.  
  54.       rowi = (unsigned *) ((unsigned) rowi + rowsize);
  55.     }
  56. }
  57.  
  58. reflexive_transitive_closure(R, n)
  59. unsigned *R;
  60. int n;
  61. {
  62.   register int rowsize;
  63.   register unsigned mask;
  64.   register unsigned *rp;
  65.   register unsigned *relend;
  66.  
  67.   transitive_closure(R, n);
  68.  
  69.   rowsize = ROWSIZE(n);
  70.   relend = (unsigned *) ((unsigned) R + n*rowsize);
  71.  
  72.   mask = 1;
  73.   rp = R;
  74.   while (rp < relend)
  75.     {
  76.       *rp |= mask;
  77.  
  78.       mask <<= 1;
  79.       if (mask == 0)
  80.     {
  81.       mask = 1;
  82.       rp++;
  83.     }
  84.  
  85.       rp = (unsigned *) ((unsigned) rp + rowsize);
  86.     }
  87. }
  88.