Cod sursa(job #3290515)

Utilizator amcbnCiobanu Andrei Mihai amcbn Data 30 martie 2025 23:07:55
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>

const int Inf = 1e9;
const int nmax = 100;
int N;
int w[nmax][nmax];
int d[nmax][nmax];

void readInput() {
	FILE* f = fopen("royfloyd.in", "r");
	fscanf(f, "%d", &N);
	for (int u = 0; u < N; ++u) {
		for (int v = 0; v < N; ++v) {
			fscanf(f, "%d", &w[u][v]);
		}
	}
}

void solve() {
	// Initializam matricea drumurilor
	for (int u = 0; u < N; ++u) {
		for (int v = 0; v < N; ++v) {
			if (u == v) {
				d[u][v] = 0;
			}
			else if (w[u][v] > 0) {
				d[u][v] = w[u][v];
			}
			else {
				d[u][v] = Inf;
			}
		}
	}
	// Rulam Roy-Floyd
	for (int k = 0; k < N; ++k) {
		for (int u = 0; u < N; ++u) {
			for (int v = 0; v < N; ++v) {
				if (d[u][k] + d[k][v] < d[u][v]) {
					d[u][v] = d[u][k] + d[k][v];
				}
			}
		}
	}
	// Schimbam valorile egale cu infinit in 0
	for (int u = 0; u < N; ++u) {
		for (int v = 0; v < N; ++v) {
			if (d[u][v] == Inf) {
				d[u][v] = 0;
			}
		}
	}
}

void writeOutput() {
	FILE* f = fopen("royfloyd.out", "w");
	for (int u = 0; u < N; ++u) {
		for (int v = 0; v < N; ++v) {
			fprintf(f, "%d ", d[u][v]);
		}
		fprintf(f, "\n");
	}
}


int main() {
	readInput();
	solve();
	writeOutput();
}