version 1.9, 2009/10/27 23:59:50 |
version 1.10, 2014/03/13 00:56:39 |
|
|
/* $OpenBSD$ */ |
/* $OpenBSD$ */ |
/* $NetBSD: warshall.c,v 1.4 1996/03/19 03:21:51 jtc Exp $ */ |
/* $NetBSD: warshall.c,v 1.4 1996/03/19 03:21:51 jtc Exp $ */ |
|
|
/* |
/* |
* Copyright (c) 1989 The Regents of the University of California. |
* Copyright (c) 1989 The Regents of the University of California. |
|
|
void |
void |
transitive_closure(unsigned int *R, int n) |
transitive_closure(unsigned int *R, int n) |
{ |
{ |
int rowsize; |
int rowsize; |
unsigned i; |
unsigned i; |
unsigned *rowj; |
unsigned *rowj; |
unsigned *rp; |
unsigned *rp; |
unsigned *rend; |
unsigned *rend; |
unsigned *ccol; |
unsigned *ccol; |
unsigned *relend; |
unsigned *relend; |
unsigned *cword; |
unsigned *cword; |
unsigned *rowi; |
unsigned *rowi; |
|
|
rowsize = WORDSIZE(n); |
rowsize = WORDSIZE(n); |
relend = R + n*rowsize; |
relend = R + n * rowsize; |
|
|
cword = R; |
cword = R; |
i = 0; |
i = 0; |
rowi = R; |
rowi = R; |
while (rowi < relend) |
while (rowi < relend) { |
{ |
ccol = cword; |
ccol = cword; |
rowj = R; |
rowj = R; |
|
|
|
while (rowj < relend) |
while (rowj < relend) { |
{ |
if (*ccol & (1 << i)) { |
if (*ccol & (1 << i)) |
rp = rowi; |
{ |
rend = rowj + rowsize; |
rp = rowi; |
while (rowj < rend) |
rend = rowj + rowsize; |
*rowj++ |= *rp++; |
while (rowj < rend) |
} else { |
*rowj++ |= *rp++; |
rowj += rowsize; |
} |
} |
else |
|
{ |
|
rowj += rowsize; |
|
} |
|
|
|
ccol += rowsize; |
ccol += rowsize; |
} |
} |
|
|
if (++i >= BITS_PER_WORD) |
if (++i >= BITS_PER_WORD) { |
{ |
i = 0; |
i = 0; |
cword++; |
cword++; |
} |
|
rowi += rowsize; |
} |
} |
|
|
rowi += rowsize; |
|
} |
|
} |
} |
|
|
void |
void |
reflexive_transitive_closure(unsigned int *R, int n) |
reflexive_transitive_closure(unsigned int *R, int n) |
{ |
{ |
int rowsize; |
int rowsize; |
unsigned i; |
unsigned i; |
unsigned *rp; |
unsigned *rp; |
unsigned *relend; |
unsigned *relend; |
|
|
transitive_closure(R, n); |
transitive_closure(R, n); |
|
|
rowsize = WORDSIZE(n); |
rowsize = WORDSIZE(n); |
relend = R + n*rowsize; |
relend = R + n * rowsize; |
|
|
i = 0; |
i = 0; |
rp = R; |
rp = R; |
while (rp < relend) |
while (rp < relend) { |
{ |
*rp |= (1 << i); |
*rp |= (1 << i); |
if (++i >= BITS_PER_WORD) { |
if (++i >= BITS_PER_WORD) |
i = 0; |
{ |
rp++; |
i = 0; |
} |
rp++; |
rp += rowsize; |
} |
} |
|
|
rp += rowsize; |
|
} |
|
} |
} |