Cod sursa(job #144630)

Utilizator vlad.maneaVlad Manea vlad.manea Data 27 februarie 2008 20:19:57
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <stdio.h>
#include <values.h>
#define nmax 128


int DMIN[nmax][nmax], D[nmax][nmax], K[nmax][nmax], MAXS[nmax][nmax], N;

int main()
{
	int i, j, k;

	freopen("rf.in", "r", stdin);
	freopen("rf.out", "w", stdout);

	scanf("%d", &N);

	for (i = 1; i <= N; ++i)
		for (j = 1; j <= N; ++j)
			scanf("%d", &D[i][j]);

	// distanta minima
	for (i = 1; i <= N; ++i)
		for (j = 1; j <= N; ++j)
		{
			DMIN[i][j] = D[i][j];
			MAXS[i][j] = i==j?0:1;
		}

	for (k = 1; k <= N; ++k)
		for (i = 1; i <= N; ++i)
			for (j = 1; j <= N; ++j)
				if
				(
					DMIN[i][k] + DMIN[k][j] < DMIN[i][j] ||
					DMIN[i][k] + DMIN[k][j] == DMIN[i][j] &&
					MAXS[i][k] + MAXS[k][j] >= MAXS[i][j]
				)
				{
					K[i][j] = k;
					DMIN[i][j] = DMIN[i][k] + DMIN[k][j];
					MAXS[i][j] = MAXS[i][k] + MAXS[k][j];
				}

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

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





	return 0;
}