Cod sursa(job #502061)

Utilizator mika17Mihai Alex Ionescu mika17 Data 17 noiembrie 2010 16:46:29
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef unsigned int ui;

int ** allocate(ui wi,ui he) {
	
	int ** G = (int**)calloc(he,sizeof(int*));
	ui i;
	for(i = 0;i < he; ++i) {
		G[i] = (int*)calloc(wi,sizeof(int));
	}
	return G;
}

void printPath(int ** phi,ui N,ui X,ui Y) {
	
	
}	

int main() {
	
	FILE *fin = fopen("royfloyd.in","r"), *fout = fopen("royfloyd.out","w");
	ui N;
	fscanf(fin,"%u",&N);
	int **G = allocate(N,N);
	ui i,j;
	for(i = 0;i < N; ++i) {
		for(j = 0;j < N; ++j) {
			fscanf(fin,"%d",&G[i][j]);		
		}
	}
	
	int **min = allocate(N,N), ** phi = allocate(N,N);

	for(i = 0;i < N; ++i)
		for(j = 0;j < N; ++j) {
			min[i][j] = G[i][j] != 0 ? G[i][j] : i == j ? 0 : INT_MAX;
			phi[i][j] = INT_MAX;
	}
	
	ui k;
	for(k = 0;k < N; ++k)
		for(i = 0;i < N; ++i)
			for(j = 0;j < N; ++j) {
				
				if(min[i][k] < INT_MAX && min[k][j] < INT_MAX)
					if(min[i][j] > min[i][k] + min[k][j]) {
						min[i][j] = min[i][k] + min[k][j];
						phi[i][j] = k;
					}
			}

	for(i = 0;i < N; ++i) {
		for(j = 0;j < N; ++j) {
			fprintf(fout,"%d ",min[i][j] == INT_MAX ? 0 : min[i][j]);		
		}
		fprintf(fout,"\n");
	}
	return 0;
}