Cod sursa(job #2436298)

Utilizator ShayTeodor Matei Shay Data 5 iulie 2019 14:15:55
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#include <vector>
#include <assert.h>

inline void print(int n) {
	char snum[65];
	int i = 0;
	do {
		snum[i++] = n % 10 + '0';
		n /= 10;
	} while (n);

	--i;

	while (i >= 0) {
		putchar(snum[i--]);
	}

	putchar(' ');
}

inline int read() {
	int n = 0;
	char c = getchar_unlocked();

	while (!('0' <= c && c <= '9')) {
		c = getchar_unlocked();
	}

	while ('0' <= c && c <= '9') {
		n = (n << 3) + (n << 1) + c - '0';
		c = getchar_unlocked();
	}

	return n;
}

int main() {
	freopen("royfloyd.in", "r", stdin);
	freopen("royfloyd.out", "w", stdout);
	short n;

	n = read();
	assert(1 <= n && n <= 100);

	std::vector<std::vector<short>> a(n + 1, std::vector<short>(n + 1));

	for (int i = 1 ; i <= n ; ++i) {
		for (int j = 1 ; j <= n ; ++j) {
			a[i][j] = read();
		}
	}

	for (int k = 1 ; k <= n ; ++k) {
		for (int i = 1 ; i <= n ; ++i) {
			for (int j = 1 ; j <= n ; ++j) {
				if (a[i][k] && a[k][j] && i != j) {
					if (a[i][j]) {
						a[i][j] = std::min(a[i][j], short(a[i][k] + a[k][j]));
					} else {
						a[i][j] = a[i][k] + a[k][j];
					}
				}
			}
		}
	}

	for (int i = 1 ; i <= n ; ++i) {
		for (int j = 1 ; j <= n ; ++j) {
			print(a[i][j]);
		}

		putchar('\n');
	}

	return 0;
}