Cod sursa(job #1463998)

Utilizator creativedoughnutCreative Doughnut creativedoughnut Data 21 iulie 2015 23:59:26
Problema Floyd-Warshall/Roy-Floyd Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>

// --- basics
#define int16 short
#define int32 int
#define int64 int long long
#define uint16 unsigned int16
#define	uint32 unsigned int32
#define uint64 unsigned int64

// --- prototypes
void roy(uint32** matrix, uint16 dim);

/// --- input/output files
#define INPUT_FILE	"royfloyd.in"
#define	OUTPUT_FILE	"royfloyd.out"

int main()
{
	freopen(INPUT_FILE, "r", stdin);
	freopen(OUTPUT_FILE, "w", stdout);

	uint16 N;
	scanf("%hd", &N);
	uint32** matrix = new uint32*[N];

	for (uint16 i = 0; i < N; i++)
	{
		matrix[i] = new uint32[N];
		for (uint16 j = 0; j < N; j++)
		{
			scanf("%u", &(matrix[i][j]));
		}
	}

	roy(matrix, N);
	
	for (uint16 i = 0; i < N; i++)
	{
		for (uint16 j = 0; j < N; j++)
		{
			printf("%u ", matrix[i][j]);
		}
		printf("\n");

		delete(matrix[i]);
	}
	delete(matrix);

	return 0;
}


// --- functions
void roy(uint32** matrix, uint16 dim)
{
	for (uint16 i = 0; i < dim; i++)
	{
		for (uint16 j = 0; j < dim; j++)
		{
			for (uint16 k = 0; k < dim; k++)
			{
				if ((matrix[i][j] == 0) || (matrix[j][k] == 0) || (i == k))
				{
					continue;
				}

				if ((matrix[i][k] == 0) || (matrix[i][j] + matrix[j][k] < matrix[i][k]))
				{
					matrix[i][k] = matrix[i][j] + matrix[j][k];
				}
			}
		}
	}
}