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