Cod sursa(job #1229154)

Utilizator thinkphpAdrian Statescu thinkphp Data 16 septembrie 2014 17:27:55
Problema Floyd-Warshall/Roy-Floyd Scor 20
Compilator c Status done
Runda Arhiva educationala Marime 1.36 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"
#define SPACELESS 0x3f3f3f3f

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

int N;//number of vertices; 1<= N <= 100

int mat[ MAX ][ MAX ];

int main() {

    read();

    solve();

    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 ]);

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

                             mat[ i ][ j ] = SPACELESS; 
           }

    fclose( stdin ); 
};

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

    int i,
        j,
        k;

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

                  if( mat[ i ][ j ] > mat[ i ][ k ] + mat[ k ][ 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) {

              if(mat[ i ][ j ] == SPACELESS) printf("0 "); 

                               else          printf("%d ", mat[ i ][ j ]);
          }

          printf("\n");
       }

    fclose( stdout );

}