Cod sursa(job #755774)

Utilizator cristiavraAvramescu Cristia cristiavra Data 6 iunie 2012 22:57:55
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<iostream>
#include<fstream>
#define infinit 1000000000

using namespace std;

int n,m,p;
int dr[50010][50010],vect_drum[50010],viz[50010];

void initializare(){

   int i,j,x,y,z;
   ifstream f("dijkstra.in");

   f>>n>>m;
   p=1;

   for(int i=1;i<=m;i++){
     f>>x>>y>>z;
     dr[x][y]=z;
     dr[y][x]=z;
   }

   for(i=1;i<=n;i++)
   {
   if(i==p || dr[p][i]==0)
       vect_drum[i]=infinit;
    else
       vect_drum[i]=dr[p][i];
    viz[i]=0;
   }
}


void dijkstra(){

  int i,ok=1,ok_verificare;
  int min,min_indice;
  viz[p]=1;
  while(ok){

    min=infinit;
    min_indice=-1;
    for(i=1;i<=n;i++)
      if(viz[i]==0 && vect_drum[i]<min)
       {
        min=vect_drum[i];
        min_indice=i;
       }

    if(min_indice==-1)
        ok=0;
      else
      {
       viz[min_indice]=1;
        ok_verificare=0;
        for(i=1;i<=n;i++)
          if(vect_drum[i]>dr[p][min_indice]+dr[min_indice][i] && dr[p][min_indice] && dr[min_indice][i])
            {
             vect_drum[i]=dr[p][min_indice]+dr[min_indice][i];
             ok_verificare=1;
            }

        if(ok_verificare==0)
         ok=0;
      }
  }
}


void afisare(){

 ofstream g("dijkstra.out");
 for(int i=1;i<=n;i++)
   if(i!=p)
   if(vect_drum[i]==infinit)
    g<<0<<" ";
    else
    g<<vect_drum[i]<<" ";

}

int main(){

 initializare();
 dijkstra();
 afisare();

 return 0;
}