Cod sursa(job #156493)

Utilizator igsifvevc avb igsi Data 12 martie 2008 16:32:53
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<fstream.h>

#define max_n 50000                   
#define in "dijkstra.in"
#define out "dijkstra.out"               
#define infinit 32000

ifstream fin(in);
ofstream fout(out);

struct nod{unsigned int nd,c; nod *urm;} *p[max_n];
unsigned int s[max_n],d[max_n],n;

void citire();                     
void init(unsigned int x);
void dijkstra();
void afisare();

int main()
{
  citire();
  init(1);
  afisare();
  
  fout.close();
  fin.close();
  return 0;
}

void afisare()
{
     for(unsigned int i=2;i<=n;i++)
       fout<<d[i]<<' ';
     fout<<'\n';
}
     
void dijkstra()
{
 unsigned int min=infinit,poz,i;
 nod *q;

    for(i=1;i<=n;i++)
      if(s[i]!=1 && d[i]<min && d[i]!=0)
	           min=d[i],poz=i;

    if(min!=infinit)
    {
      s[poz]=1;
      q=p[poz];

      while(q)
      {
         if(s[q->nd]!=1)
         {
             if(d[q->nd]==0)
                d[q->nd]=d[poz]+q->c;
             else
                if(d[q->nd]>d[poz]+q->c)
	                  d[q->nd]=d[poz]+q->c;
         }
         q=q->urm;
      }
    }
}

void init(unsigned int x)
{
  s[x]=1;
  nod *q;
  q=p[x];
  while(q)
  {
   d[q->nd]=q->c;
   q=q->urm;
  }

  for(unsigned int i=2;i<=n;i++)
    dijkstra();
}

void citire()
{
  unsigned int x,y,z;
  long m;
  nod *q;

  fin>>n;
  fin>>m;
  
  while(fin>>x>>y>>z)
  {
    q=new nod;
    q->nd=y;
    q->c=z;
    q->urm=p[x];
    p[x]=q;

    q=new nod;
    q->nd=x;
    q->c=z;
    q->urm=p[y];
    p[y]=q;
  }
}