Cod sursa(job #156642)

Utilizator igsifvevc avb igsi Data 12 martie 2008 17:56:19
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<stdio.h>

#define max 50001
#define infinit 2000

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

void citire();
void init();
void dijkstra();
void afisare();

int main()
{
    citire();
    init();
    afisare();
    
    return 0;
}

void dijkstra()
{
     long int i,min,poz=0;
     nod *c;
     
     for(i=1,min=infinit;i<=n;i++)
       if(!s[i] && min>d[i] && d[i]!=-1)
          min=d[i],poz=i;
     
     if(min!=infinit)
     {
        s[poz]=1;
        for(c=p[poz];c;c=c->urm)
           if(d[poz]+c->inf<d[c->nd])
                 d[c->nd]=d[poz]+c->inf;
           else
              if(d[c->nd]==-1)
                  d[c->nd]=d[poz]+c->inf;
     }
}    

void init()
{
     nod *c;
     long int i;
     s[1]=1;
     
     for(i=1;i<=n;i++)
       d[i]=-1;
     
     for(c=p[1];c;c=c->urm)
        d[c->nd]=c->inf;
     
     for(i=1;i<n;i++)
       dijkstra();
}       
       
void afisare()
{
     FILE *f=fopen("dijkstra.out","w");
     long int i;
 
     for(i=2;i<=n;i++)
       fprintf(f,"%ld ",d[i]==-1?0:d[i]);
 
     fprintf(f,"\n");
     fclose(f);
}

void citire()
{
     FILE * f=fopen("dijkstra.in","r");
     long int x,y,z;
     long int m,i;
     nod *c;
     
     fscanf(f,"%ld %ld",&n,&m);
     
     for(i=1;i<=m;i++)
     {
        fscanf(f,"%ld %ld %ld",&x,&y,&z);
     
        c=new nod; 
        c->inf=z;
        c->nd=y;
        c->urm=p[x];
        p[x]=c;
     
        c=new nod;
        c->inf=z;
        c->nd=x;
        c->urm=p[y];
        p[y]=c;
     }
     
     fclose(f);
}