1*84d9c625SLionel Sambuc /* $NetBSD: warshall.c,v 1.7 2013/04/06 14:52:24 christos Exp $ */ 2*84d9c625SLionel Sambuc 34a17663cSThomas Veerman /* Id: warshall.c,v 1.7 2010/06/06 22:48:51 tom Exp */ 44a17663cSThomas Veerman 54a17663cSThomas Veerman #include "defs.h" 64a17663cSThomas Veerman 74a17663cSThomas Veerman #include <sys/cdefs.h> 8*84d9c625SLionel Sambuc __RCSID("$NetBSD: warshall.c,v 1.7 2013/04/06 14:52:24 christos Exp $"); 94a17663cSThomas Veerman 104a17663cSThomas Veerman static void transitive_closure(unsigned * R,int n)114a17663cSThomas Veermantransitive_closure(unsigned *R, int n) 124a17663cSThomas Veerman { 134a17663cSThomas Veerman int rowsize; 144a17663cSThomas Veerman unsigned i; 154a17663cSThomas Veerman unsigned *rowj; 164a17663cSThomas Veerman unsigned *rp; 174a17663cSThomas Veerman unsigned *rend; 184a17663cSThomas Veerman unsigned *ccol; 194a17663cSThomas Veerman unsigned *relend; 204a17663cSThomas Veerman unsigned *cword; 214a17663cSThomas Veerman unsigned *rowi; 224a17663cSThomas Veerman 234a17663cSThomas Veerman rowsize = WORDSIZE(n); 244a17663cSThomas Veerman relend = R + n * rowsize; 254a17663cSThomas Veerman 264a17663cSThomas Veerman cword = R; 274a17663cSThomas Veerman i = 0; 284a17663cSThomas Veerman rowi = R; 294a17663cSThomas Veerman while (rowi < relend) 304a17663cSThomas Veerman { 314a17663cSThomas Veerman ccol = cword; 324a17663cSThomas Veerman rowj = R; 334a17663cSThomas Veerman 344a17663cSThomas Veerman while (rowj < relend) 354a17663cSThomas Veerman { 364a17663cSThomas Veerman if (*ccol & (unsigned)(1 << i)) 374a17663cSThomas Veerman { 384a17663cSThomas Veerman rp = rowi; 394a17663cSThomas Veerman rend = rowj + rowsize; 404a17663cSThomas Veerman while (rowj < rend) 414a17663cSThomas Veerman *rowj++ |= *rp++; 424a17663cSThomas Veerman } 434a17663cSThomas Veerman else 444a17663cSThomas Veerman { 454a17663cSThomas Veerman rowj += rowsize; 464a17663cSThomas Veerman } 474a17663cSThomas Veerman 484a17663cSThomas Veerman ccol += rowsize; 494a17663cSThomas Veerman } 504a17663cSThomas Veerman 514a17663cSThomas Veerman if (++i >= BITS_PER_WORD) 524a17663cSThomas Veerman { 534a17663cSThomas Veerman i = 0; 544a17663cSThomas Veerman cword++; 554a17663cSThomas Veerman } 564a17663cSThomas Veerman 574a17663cSThomas Veerman rowi += rowsize; 584a17663cSThomas Veerman } 594a17663cSThomas Veerman } 604a17663cSThomas Veerman 614a17663cSThomas Veerman void reflexive_transitive_closure(unsigned * R,int n)624a17663cSThomas Veermanreflexive_transitive_closure(unsigned *R, int n) 634a17663cSThomas Veerman { 644a17663cSThomas Veerman int rowsize; 654a17663cSThomas Veerman unsigned i; 664a17663cSThomas Veerman unsigned *rp; 674a17663cSThomas Veerman unsigned *relend; 684a17663cSThomas Veerman 694a17663cSThomas Veerman transitive_closure(R, n); 704a17663cSThomas Veerman 714a17663cSThomas Veerman rowsize = WORDSIZE(n); 724a17663cSThomas Veerman relend = R + n * rowsize; 734a17663cSThomas Veerman 744a17663cSThomas Veerman i = 0; 754a17663cSThomas Veerman rp = R; 764a17663cSThomas Veerman while (rp < relend) 774a17663cSThomas Veerman { 784a17663cSThomas Veerman *rp |= (unsigned)(1 << i); 794a17663cSThomas Veerman if (++i >= BITS_PER_WORD) 804a17663cSThomas Veerman { 814a17663cSThomas Veerman i = 0; 824a17663cSThomas Veerman rp++; 834a17663cSThomas Veerman } 844a17663cSThomas Veerman 854a17663cSThomas Veerman rp += rowsize; 864a17663cSThomas Veerman } 874a17663cSThomas Veerman } 88