20 |
|
|
21 |
|
|
22 |
#include "system.h" |
#include "system.h" |
23 |
|
#include "getargs.h" |
24 |
#include "warshall.h" |
#include "warshall.h" |
25 |
|
|
26 |
/*-------------------------------------------------------------. |
/*-------------------------------------------------------------. |
28 |
| transive closure of what was given. | |
| transive closure of what was given. | |
29 |
`-------------------------------------------------------------*/ |
`-------------------------------------------------------------*/ |
30 |
|
|
31 |
|
static void |
32 |
|
bitmatrix_print (const char *title, unsigned *matrix, size_t size) |
33 |
|
{ |
34 |
|
size_t i, j; |
35 |
|
size_t rowsize = WORDSIZE (size) * sizeof (unsigned); |
36 |
|
#define ROW(Num) ((unsigned *) ((char *) matrix + ((Num) * rowsize))) |
37 |
|
|
38 |
|
/* Title. */ |
39 |
|
fprintf (stderr, "%s BEGIN\n", title); |
40 |
|
|
41 |
|
/* Column numbers. */ |
42 |
|
fputs (" ", stderr); |
43 |
|
for (i = 0; i < size; ++i) |
44 |
|
putc (i / 10 ? '0' + i / 10 : ' ', stderr); |
45 |
|
putc ('\n', stderr); |
46 |
|
fputs (" ", stderr); |
47 |
|
for (i = 0; i < size; ++i) |
48 |
|
fprintf (stderr, "%d", i % 10); |
49 |
|
putc ('\n', stderr); |
50 |
|
|
51 |
|
/* Bar. */ |
52 |
|
fputs (" +", stderr); |
53 |
|
for (i = 0; i < size; ++i) |
54 |
|
putc ('-', stderr); |
55 |
|
fputs ("+\n", stderr); |
56 |
|
|
57 |
|
/* Contents. */ |
58 |
|
for (i = 0; i < size; ++i) |
59 |
|
{ |
60 |
|
fprintf (stderr, "%2d|", i); |
61 |
|
for (j = 0; j < size; ++j) |
62 |
|
fputs (BITISSET (ROW (i), j) ? "1" : " ", stderr); |
63 |
|
fputs ("|\n", stderr); |
64 |
|
} |
65 |
|
|
66 |
|
/* Bar. */ |
67 |
|
fputs (" +", stderr); |
68 |
|
for (i = 0; i < size; ++i) |
69 |
|
putc ('-', stderr); |
70 |
|
fputs ("+\n", stderr); |
71 |
|
|
72 |
|
/* End title. */ |
73 |
|
fprintf (stderr, "%s END\n\n", title); |
74 |
|
} |
75 |
|
|
76 |
#define R(Num) (unsigned *) ((char *) R + ((Num) * rowsize)) |
#define R(Num) (unsigned *) ((char *) R + ((Num) * rowsize)) |
77 |
|
|
78 |
static void |
static void |
81 |
int rowsize = WORDSIZE (n) * sizeof (unsigned); |
int rowsize = WORDSIZE (n) * sizeof (unsigned); |
82 |
int i, j, k; |
int i, j, k; |
83 |
|
|
84 |
|
if (trace_flag) |
85 |
|
bitmatrix_print ("TC: Input", R, n); |
86 |
|
|
87 |
|
/* R (J, I) && R (I, K) => R (J, K). |
88 |
|
I *must* be the outter loop. */ |
89 |
|
|
90 |
for (i = 0; i < n; ++i) |
for (i = 0; i < n; ++i) |
91 |
for (j = 0; j < n; ++j) |
for (j = 0; j < n; ++j) |
92 |
if (BITISSET (R (i), j)) |
if (BITISSET (R (j), i)) |
93 |
for (k = 0; k < rowsize; ++k) |
for (k = 0; k < n; ++k) |
94 |
if (BITISSET (R (i), k)) |
if (BITISSET (R (i), k)) |
95 |
SETBIT (R (j), k); |
SETBIT (R (j), k); |
96 |
|
|
97 |
|
if (trace_flag) |
98 |
|
bitmatrix_print ("TC: Output", R, n); |
99 |
} |
} |
100 |
|
|
101 |
|
|