Cod sursa(job #2601540)

Utilizator vladcainamisirVlad Cainamisir vladcainamisir Data 14 aprilie 2020 17:15:17
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<vector>
#include<queue>
const int NMAX = 50000;
const int INF = 2000000000;
struct drum
{
  int dest , cost;
};
int n;
std ::vector<drum>v[NMAX + 1];
int D[NMAX + 1];
bool inQueue[NMAX + 1];

struct helper
{
  bool operator()(int x , int y)
  {
    return D[x] > D[y];
  }
};
std ::priority_queue<int , std :: vector<int> ,helper> q;
void dijkstra(int start)
{
  for(int i = 1; i <= n ; i ++)
    D[i] = INF;
  D[start] = 0;
  q.push(start);
  inQueue[start] = 1;
  while(q.empty() == false)
  {
    int thisNode = q.top();
    q.pop();
    inQueue[thisNode] = 0;
    for(int i = 0 ; i < v[thisNode].size() ; i ++)
    {
      int Vecin = v[thisNode][i].dest;
      int Cost = v[thisNode][i].cost;
      if(D[thisNode] + Cost < D[Vecin])
      {
        D[Vecin] = D[thisNode] + Cost;
        if(inQueue[Vecin] == 0){
          q.push(Vecin);
          inQueue[Vecin] = 1;
        }
      }
    }
  }
}
int main()
{
  freopen("dijkstra.in" , "r" , stdin);
  freopen("dijkstra.out" , "w" , stdout);
  int m, a, b, c;
  scanf("%d%d" , &n , &m);
  for(int i = 1; i <= m ; i ++)
  {
    scanf("%d%d%d" , &a,  &b , &c);
    v[a].push_back({b , c});
  }
  dijkstra(1);
  for(int i = 2; i <= n ; i ++){
    if(D[i] != INF)
    printf("%d ", D[i]);
    else
      printf("0 ");
  }
  return 0;
}