8.2.Warshall

/*
 *	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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值