Cod sursa(job #611136)

Utilizator monica_133Monica Marinescu monica_133 Data 30 august 2011 22:17:31
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
using namespace std;

const int inf = 1<<30;
#define MAX 50000

typedef struct graf
{
   int nod,et;
   graf* next;
}graf;


int N,M,d[MAX];
bool T[MAX];
int nr;
graf* a[MAX];

void adaug(int x,int y,int et)
{
   graf* aux = new graf();
   aux->et=et;
   aux->nod = y;
   aux->next = a[x];
   a[x] = aux;
}

void citire()
{
   ifstream f("dijkstra.in");
   f>>N>>M;
   int x,y,z;

   for(int i=0;i<M;i++)
   {
      f>>x>>y>>z; 
      adaug(x-1,y-1,z);
   }
   f.close();

  for(int i=1;i<N;i++)
  {
      T[i] = false;
      d[i] = inf;
   }
   graf* aux = new graf();
   aux = a[0];
   while(aux)
   {
      d[aux->nod] = aux->et;
      aux = aux->next;
   }

   T[0] = true;
   nr = 1;
};

void solve()
{
   int xp,min;
   while(nr<N)
   {
      min = inf;
      for(int i=1;i<N;i++)
         if(!T[i] && d[i]<min)
         {
            xp = i;
            min = d[xp];
         }
      T[xp] = true;
      nr++;
      graf* aux = new graf();
      aux = a[xp];
      while(aux)
      {
         if(!T[aux->nod] && d[aux->nod]>d[xp]+aux->et)
            d[aux->nod] = d[xp]+aux->et;
         aux= aux->next;
         
      }
   }
   
   ofstream g("dijkstra.out");
   for(int i=1;i<N;i++)
      if(d[i]!=inf)
         g<<d[i]<<" ";
      else 
         g<<"0 ";
   g.close();
}

int main()
{
   citire();
   solve();
   return 0;
}