Cod sursa(job #1229174)

Utilizator thinkphpAdrian Statescu thinkphp Data 16 septembrie 2014 18:06:20
Problema Floyd-Warshall/Roy-Floyd Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.22 kb
#include <stdio.h>
#define MAX 102
#define loop(a, b, c) for(a = b; a <= c; a++)
#define FIN "royfloyd.in"
#define FOUT "royfloyd.out"

//function prototypes
void read();
void RoyFloyd();
void write();

long int N;//number of vertices; 1<= N <= 100
long mat[ MAX ][ MAX ];

int main() {

    read();
    RoyFloyd();
    write();

   return 0; 
};

void read() {

    int i,j;

    freopen(FIN , "r", stdin);

    scanf("%ld", &N);

    loop(i, 1, N)
          loop(j, 1, N)
                scanf("%ld", &mat[ i ][ j ]);

    fclose( stdin ); 
};

//Roy-Floyd in action using Dynamic Programming
void RoyFloyd() {

    int i,
        j,
        k;

    loop(i, 1, N) loop(j, 1, N) loop(k, 1, N)

                  if(i != j && mat[ i ][ k ] != 0 && mat[ j ][ k ] != 0) 

                             if(mat[ i ][ k ] + mat[ k ][ j ] < mat[ i ][ j ] || !mat[ i ][ j ])

                                            mat[ i ][ j ] = mat[ i ][ k ] + mat[ k ][ j ];
};

void write() {

    int i,
        j;

    freopen(FOUT, "w", stdout);

    loop(i, 1, N) {
          loop(j, 1, N)
               printf("%ld ", mat[ i ][ j ]);
          printf("\n");
    }

    fclose( stdout );

}