Cod sursa(job #169800)

Utilizator sanaDascalu Laurentiu sana Data 1 aprilie 2008 22:58:43
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>

void write(int **data, int n, FILE *fout);

int **allocate(int n) {
	int **data, i, j;

	data=(int **)malloc(n*sizeof(int *));
	for (i=0; i<n; i++) {
		data[i]=(int *)malloc(n*sizeof(int));
		for (j=0; j<n; j++)
			data[i][j]=0;
	}

	return data;
}

void read(int **data, int n, FILE *fin) {
	int i, j;
	for (i=0; i<n; i++) {
		for (j=0; j<n; j++) {
			fscanf(fin, "%d", &data[i][j]);
		}
	}
}

void royfloyd(int **data, int n, FILE *fout) {
	int i, j, k;

	for (k=0; k<n; k++) {
		for (i=0; i<n; i++) {
			for (j=0; j<n; j++) {
				if (i!=j && data[i][k] && data[k][j] && (data[i][j] >(data[i][k]
						+data[k][j]) || !data[i][j]))
					data[i][j]=data[i][k]+data[k][j];
			}
		}
	}
	write(data, n, fout);
}

void write(int **data, int n, FILE *fout) {
	int i, j;
	for (i=0; i<n; i++) {
		for (j=0; j<n; j++) {
			fprintf(fout, "%d ", data[i][j]);
		}
		fprintf(fout, "\n");
	}
}

int main() {
	int **data, n;
	FILE *fin, *fout;
	fin=fopen("royfloyd.in", "rt");
	fout=fopen("royfloyd.out", "wt");

	fscanf(fin, "%d", &n);
	data=allocate(n);
	read(data, n, fin);
	royfloyd(data, n, fout);

	fclose(fin);
	return 0;
}