Cod sursa(job #157263)

Utilizator igsifvevc avb igsi Data 12 martie 2008 22:12:58
Problema Floyd-Warshall/Roy-Floyd Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<stdio.h>

#define max 101
#define infinit 1<<30

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

struct nod{int nd,inf; nod *urm;} *p[max];
int n,d[max],s[max];

void afisare()
{
     int i;
     for(i=1;i<=n;i++)
       fprintf(fout,"%d ",d[i]!=infinit ? d[i] : 0);
     fprintf(fout,"\n");
}

void dijkstra(int sursa)
{
     int min,poz=0,i,j;
     nod *c;
     
     for(i=1;i<=n;i++)
        d[i]=infinit,s[i]=0;
     s[sursa]=1;

     for(c=p[sursa];c;c=c->urm)
        d[c->nd]=c->inf;
     
     for(i=1;i<n;i++)
     {
            min=infinit;         
            for(j=1;j<=n;j++)
              if(!s[j] && min>d[j] && d[j]!=infinit)
                min=d[j],poz=j;    
            if(min!=infinit)
            {
               s[poz]=1;
               for(c=p[poz];c;c=c->urm)
                  if((d[c->nd]>c->inf+d[poz] || d[c->nd]==infinit) && c->nd!=sursa)
                      d[c->nd]=c->inf+d[poz];
            }
     }
}
                   
int main()
{
    nod *c;
    int i,j,x;
    
    fscanf(fin,"%d",&n);
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
      {
          fscanf(fin,"%d",&x);
          if(x!=0)
          {
               c=new nod;
               c->nd=j;
               c->inf=x;
               c->urm=p[i];
               p[i]=c;
          }
      }
     for(i=1;i<=n;i++)
       dijkstra(i),afisare();
        
    fclose(fin);
    fclose(fout);
    return 0;
}