/*
* 8.2.Warshall
* 2011/08/13
* ArtWalk
*/
/*
a b c d a b c d
a 0 1 0 0 a 1 1 1 1
A = b 0 0 0 1 T = b 1 1 1 1
c 0 0 0 0 c 0 0 0 0
d 1 0 1 0 d 1 1 1 1
R(k)(ij) = R(k-1)(ij) || R(k-1)(ik) && R(k-1)(kj)
*/
#include <iostream>
using namespace std;
#define M 4
void display( int R[M][M] );
void process( int A[M][M] );
int main(int ac, char** av)
{
int A[M][M] = {
{ 0, 1, 0, 0 },
{ 0, 0, 0, 1 },
{ 0, 0, 0, 0 },
{ 1, 0, 1, 0 }
};
process(A);
return 0;
}
void process( int A[M][M] ) {
// R : 0 -> M
int R[M+1][M][M] = {0};
// A -> R
for ( int i = 0; i != M; ++i ) {
for ( int j = 0; j != M; ++j ) {
R[0][i][j] = A[i][j];
}
}
display(R[0]);
// R : 1 -> M
for ( int k = 1; k <= M; ++k ) {
for ( int i = 0; i != M; ++i ) {
for ( int j = 0; j != M; ++j ) {
R[k][i][j] = ( R[k-1][i][j]
|| ( R[k-1][i][k-1] && R[k-1][k-1][j] ) );
}
}
printf("%d\n",k);
display(R[k]);
}
}
void display( int R[M][M] ) {
for ( int i = 0; i != M; ++i ) {
for ( int j = 0; j != M; ++j ) {
printf("%d ", R[i][j]);
}
printf("\n");
}
//printf("\n");
}