Cod sursa(job #246866)

Utilizator Sorin_IonutBYSorynyos Sorin_Ionut Data 21 ianuarie 2009 18:30:25
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>

#define maxn 250001
#define infin 1<<30
#define in "dijkstra.in"
#define out "dijkstra.out"

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

struct nod
{
 int inf,cost;
 nod *urm;
};

int n,m;
nod *l[maxn];
int d[maxn],q[maxn];

void read();
void write();
void add(int,int,int);
void dijkstra();

int main()
{
 read();
  fclose(fin);
  
 dijkstra();

 write();
  fclose(fout);
  
 return 0;
}

void add(int x,int y,int cost)
{
 nod *q =new nod;
 
 q->inf=y;
 q->cost=cost;
 q->urm=l[x];
 l[x]=q;
}

void read()
{
 int i;
    
 fscanf(fin,"%d %d",&n,&m);

 int x,y,z;
 
 for(i=1;i<=m;++i)
 {
  fscanf(fin,"%d %d %d",&x,&y,&z);
  add(x,y,z);
 }
}

void write()
{
 int i;
    
 for(i=2;i<=n;++i)
  fprintf(fout,"%d ",d[i]==infin?0:d[i]);
 fprintf(fout, "\n");
}

void dijkstra()
{
 int i,j;
    
 for(i=2;i<=n;++i)
  d[i]=infin;

 int min,pmin=0;
 
 for(i=1;i<=n;++i)
 {
  min=infin;

  for(j=1;j<=n;++j)
   if(d[j]<min && !q[j])
   {
    min=d[j];
    pmin=j;
   }

  q[pmin]=1;

  nod *t=l[pmin];

  while(t)
  {
   if(d[t->inf]>d[pmin]+t->cost)
    d[t->inf]=d[pmin]+t->cost;

   t=t->urm;
  }
 }
}