Cod sursa(job #145248)

Utilizator floringh06Florin Ghesu floringh06 Data 28 februarie 2008 17:21:01
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>

using namespace std;

#define FIN "royfloyd.in"
#define FOUT "royfloyd.out"
#define MAX_N 105
#define INF 0x3f3f3f3

int MP[MAX_N][MAX_N];
int N, M, x, y, c, i, j, k;

    void crearematpond ( void )
    {
         int i, j;
         for (i = 1; i <= N; ++i)
             for (j = 1; j <= N; ++j)
                 scanf ("%d", MP[i] + j);
         for ( i = 1; i <= N; ++i)
             for ( j = 1; j <= N; ++j)
                 if (i != j && !MP[i][j])  MP[i][j] = INF;
    }
    
    void way (int i, int j)
    {
         int k;
         int found;
         k = 1; found = 0;
         while (k <= N && !found)
         {
               if (i != k && j != k && MP[i][j] == MP[i][k] + MP[k][j])
               {
                     way (i, k); way(k, j); 
                     found = 1;
               }
               ++k;
         }
         if (!found) printf ("%d ", j); 
    }    
    
    void getway (int nodin, int nodout)
    {
         if (MP[nodin][nodout]<INF)
         {
            printf ("Lungimea: %d\n", MP[nodin][nodout]);
            printf ("%d ", nodin);
            way (nodin, nodout);
         }
         else printf ("Nu e drum!");
    }
    

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d", &N);
        crearematpond ();
        
        for ( k = 1; k <= N; ++k)
            for ( i = 1; i <= N; ++i)
                for ( j = 1; j <= N; ++j)
                    if (MP[i][j] > MP[i][k] + MP[k][j])
                       MP[i][j] = MP[i][k] + MP[k][j];
        for ( i = 1; i <= N; ++i)
        {
            for ( j = 1; j <= N; ++j)
                printf ("%d ", MP[i][j]);
            printf ("\n");
        }
        
       // getway (1, 3);
        
        return 0;
    }