Cod sursa(job #143985)

Utilizator mithyPopovici Adrian mithy Data 26 februarie 2008 23:55:03
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#define NMax 101

int n;
int a[NMax][NMax], b[NMax][NMax], prev[NMax][NMax];

void citire();
void rf();
void rez();

int main()
{
	citire();
	rf();
	rez();
	return 0;
}
void rez()
{
	int i, j, max, aux;

	for (i=1; i<=n; i++)
	{
		for (j=1; j<=n; j++)
			printf( "%d ", a[i][j] );
		printf( "\n" );
	}

	for (i=1; i<=n; i++)
	{
		for (j=1; j<=n; j++)
			if ( i != j )
				printf( "%d ", b[i][j] );
			else
				printf( "0 " );
		printf( "\n" );
	}
}
void rf()
{
	int i, j, k;

	for (i=1; i<=n; i++)
	for (j=1; j<=n; j++)
		if ( a[i][j] )
			b[i][j] = 1;

	for (k=1; k<=n; k++)
	for (i=1; i<=n; i++)
	for (j=1; j<=n; j++)
		if ( a[i][k] && a[k][j] && ( a[i][j] >= a[i][k]+a[k][j] || !a[i][j] ) && i != j )
		{
			if ( b[i][k] + b[k][i] > b[i][j] )
			{
				a[i][j]    = a[i][k] + a[k][j];
				prev[i][j] = k;
				prev[j][i] = k;
				b[i][j]++;
				b[j][i]++;
			}
		}

}
void citire()
{
	int i, j;
	freopen( "rf.in", "rt", stdin );
	freopen( "rf.out", "wt", stdout );

	scanf( "%d", &n );

	for (i=1; i<=n; i++)
		for (j=1; j<=n; j++)
		{
			scanf( "%d", &a[i][j] );
			prev[i][j] = -1;
		}
}