Cod sursa(job #1229167)

Utilizator thinkphpAdrian Statescu thinkphp Data 16 septembrie 2014 17:53:01
Problema Floyd-Warshall/Roy-Floyd Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.19 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

int mat[ MAX ][ MAX ];

int main() {

    read();

    RoyFloyd();

    write();

   return 0; 
};

void read() {

    int i,j;

    freopen(FIN , "r", stdin);

    scanf("%d", &N);

    loop(i, 1, N)

           loop(j, 1, N)

                scanf("%d", &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( mat[ i ][ k ] && mat[ k ][ j ] && (mat[ i ][ j ] > mat[ i ][ k ] + mat[ k ][ j ] || !mat[ i ][ j ]) && 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("%d ", mat[ i ][ j ]);
          }

          printf("\n");
     }

    fclose( stdout );

}