Cod sursa(job #2224525)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 24 iulie 2018 12:43:46
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<cstdio>
#include<vector>
#include<queue>
const int NMAX = 50000;
const int INF = (1 << 30);
int n , m;
struct arc
{
int first , second;
};
int D[NMAX + 1];
int incoada[NMAX + 1];
struct helper
{
  bool operator()(int x , int y)
  {
    return D[x] > D[y];
  }
};
std :: vector<arc>v[NMAX + 1];
std :: priority_queue<int , std :: vector<int> ,helper> coada;
void dijkstra(int start)
{
  for(int i = 1; i <= n ; i ++)
    D[i] =  INF;
  D[start] = 0;
  coada.push(start);
  incoada[start] = 1;
  while(!coada.empty())
  {
  int nodCurent = coada.top();
        coada.pop();
        incoada[nodCurent] = false;
        for(size_t i = 0; i < v[nodCurent].size(); i++)
        {
            int Vecin = v[nodCurent][i].first;
            int Cost = v[nodCurent][i].second;
            if(D[nodCurent] + Cost < D[Vecin])
            {
                D[Vecin] = D[nodCurent] + Cost;
                if(incoada[Vecin] == false)
                {
                    coada.push(Vecin);
                    incoada[Vecin] = true;
                }
            }
        }
  }
}
int main()
{
  int x , y , c;
  freopen("dijkstra.in","r",stdin);
  freopen("dijkstra.out","w",stdout);
  scanf("%d%d",&n,&m);
  for(int i = 1; i <= m ; i ++)
  {
    scanf("%d%d%d",&x,&y,&c);
    v[x].push_back({y , c});
  }
  dijkstra(1);
  for(int i = 2 ; i <= n ; i ++)
    printf("%d ",D[i]);
  return 0;
}