Cod sursa(job #633473)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 13 noiembrie 2011 20:29:51
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
using namespace std;

#define MAXN 105 
#define INF 


int matr[MAXN][MAXN];

int main(){
  int n;
  int i,j,k;
  //citesc datele
   FILE *fin=fopen("royfloyd.in","r");
   FILE *fout=fopen("royfloyd.out","w");
   fscanf(fin,"%d",&n);
   for(i=1;i<=n;i++)
     for(j=1;j<=n;j++){
       fscanf(fin,"%d",&matr[i][j]);
     }
   //incep algoritmul
   for(k=1;k<=n;k++)
      //fixez subsetul de puncte intermediare
      for(i=1;i<=n;i++)
         for(j=1;j<=n;j++)
           //intre i si j, cu un punct intermediar din setul 1...k
           //daca e drum de la i la k si de la k la j (k nu coincide cu nicunul dintre capete)
           //si nu incerc sa imbunatatesc diagonala:P
           //si fie pot sa imbunatatesc ce e deja, fie defapt pana acum nu am gasit nimik, si deci acum tocmai am un drum
           if(matr[i][k] && matr[k][j] && i!=j && (matr[i][k]+matr[k][j]<matr[i][j] || matr[i][j]==0))
                      matr[i][j]=matr[i][k]+matr[k][j];

  //afisarea
   for(i=1;i<=n;i++){
     for(j=1;j<=n;j++)
       fprintf(fout,"%d ",matr[i][j]);
   fprintf (fout,"\n");
   }

}