Cod sursa(job #1341128)

Utilizator aimrdlAndrei mrdl aimrdl Data 12 februarie 2015 14:41:16
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>

short ** read (FILE *in, int *n) {
	fscanf(in, "%d", n);
	
	short **m = new short *[*n];
	for (int i = 0; i < *n; i++) {
		m[i] = new short[*n];
	}
	
	for (int i = 0; i < *n; i++) {
		for (int j = 0; j < *n; j++) {
			fscanf(in, "%hd", &m[i][j]);
		}
	}
	
	return m;
}

void print (FILE *out, short **m, int n) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			fprintf(out, "%hd ", m[i][j]);
		}
		fprintf(out, "\n");
	}
}

void royfloyd (short **m, int n) {
	for (int k = 0; k < n; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if ((i != j) && (m[i][k] != 0) && (m[k][j] != 0)) {
					int np = m[i][k] + m[k][j];	
					if (m[i][j] == 0) {
						m[i][j] = np;
					} else if (m[i][j] > np) {
						m[i][j] = np;
					}
				}
			}
		}
	}
}

int main (void) {
	FILE *in = fopen("royfloyd.in", "r");
	FILE *out = fopen("royfloyd.out", "w");
	
	int n;
	short **m = read(in, &n);
	royfloyd(m, n);
	print(out, m, n);
	
	return 0;
}