Cod sursa(job #246568)

Utilizator igsifvevc avb igsi Data 21 ianuarie 2009 09:14:13
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<stdio.h>

#define max_n 101
#define infinit 1<<30

FILE *in=fopen("royfloyd.in","r");
FILE *out=fopen("royfloyd.out","w");

struct nod{int nd,inf; nod *urm;} *l[max_n];
int d[max_n],v[max_n],n;

void citire()
{
     nod *c;
     fscanf(in,"%d",&n);

     int z,i,j;
     for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
       {  
          fscanf(in,"%d",&z);   
          if(i!=j && z)
          {  
              c=new nod;
              c->nd=j;
              c->inf=z;
              c->urm=l[i];
              l[i]=c;
          }
       }
}

int main()
{
    citire();
    int i,min,poz,k;
    nod *c;
    
for(k=1;k<=n;k++)
{
    for(i=1;i<=n;i++)
       d[i]=infinit,v[i]=0;
    for(c=l[k];c;c=c->urm)
       d[c->nd]=c->inf;
    v[k]=1;
    for(i=1;i<n;i++)
    {
       min=infinit;
       for(int j=1;j<=n;j++)
          if(!v[j] && min>d[j] && d[j]!=infinit)
              min=d[j],poz=j;
       if(min!=infinit)
       {
          v[poz]=1;
          for(c=l[poz];c;c=c->urm)
             if(d[poz]+c->inf<d[c->nd])
                d[c->nd]=d[poz]+c->inf;
       }
    }
    
    for(i=1;i<=n;i++)
     fprintf(out,"%d ",d[i]==infinit ? 0 : d[i]);
    fprintf(out,"\n");
}
    fclose(out);
    return 0;
}