Cod sursa(job #1173867)

Utilizator DuxarFII-Stefan-Negrus Duxar Data 20 aprilie 2014 23:58:23
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <vector>
#include <cstdio>
#include <climits>

using namespace std;

#define ONLINE_JUDGE

typedef vector<int> vi;
typedef vector<vi> vvi;

#ifdef ONLINE_JUDGE
	FILE *input = fopen("royfloyd.in", "r");
	FILE *output = fopen("royfloyd.out", "w");
#else
	FILE *input = fopen("input.txt", "r");
	FILE *output = stdout;
#endif

int N;
vvi V;

void solve(vvi &V, int N);
void show(vvi &V, int N);

int main() {

	fscanf(input, "%d\n", &N);
	V.resize(N, vector<int> (N));
	
	for (auto i = 0; i < N; ++i) {
		for (auto j = 0; j < N; ++j) {
			fscanf(input, "%d", &V[i][j]);
		}
	}
	
//	for (auto i = 0; i < N; ++i) {
//		for (auto j = 0; j < N; ++j) {
//			fprintf(output, "%d ", V[i][j]);
//		}
//		fprintf(output,"\n");
//	}

	solve(V, N);
	show(V, N);
	
	
	fclose(input);
	fclose(output);
	return 0;
}

void show(vvi &V, int N) {
	for (auto i = 0; i < N; ++i) {
		for (auto j = 0; j < N; ++j) {
			fprintf(output, "%d ", V[i][j]);
		}
		fprintf(output, "\n");
	}
}

void solve(vvi &V, int N) {
	for (auto k = 0; k < N; ++k) {
		for (auto i = 0; i < N; ++i) {
			for (auto j = 0; j < N; ++j) {
				if (i != j) {
					if (V[i][k] && V[k][j] && 
						((V[i][k] + V[k][j] < V[i][j]) ||
						V[i][j] == 0)) {
							V[i][j] = V[i][k] + V[k][j];
						}
				}
			}
		}
	}
}