Cod sursa(job #2491429)

Utilizator popashtefan10Popa Stefan popashtefan10 Data 12 noiembrie 2019 16:32:59
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#define NMAX 50000
#define c first
#define parinte second.first
#define nod second.second
#define INF 2e10

using namespace std;

int n, m;
int dmin[NMAX + 5];
vector< pair<int, int> > a[NMAX + 5];
priority_queue< pair<int, pair<int, int> >, vector< pair<int, pair<int, int> > >, greater< pair<int, pair<int, int> > > > pq;

int main() {
  freopen("dijkstra.in", "r", stdin);
  freopen("dijkstra.out", "w", stdout);
  int m, x, y, c;

  scanf("%d %d", &n, &m);
  for(int i = 1; i <= m; i++) {
    scanf("%d %d %d", &x, &y, &c);
    a[x].push_back({y, c});
  }

  for(int i = 1; i <= n; i++)
    dmin[i] = INF;
  pq.push({0, {-1, 1}});
  while(!pq.empty()) {
    while(!pq.empty() && dmin[pq.top().nod] < INF)
      pq.pop();

    if(!pq.empty()) {
      pair<int, pair<int, int> > cn = pq.top();
      pq.pop();
      dmin[cn.nod] = cn.c;
      for(auto y: a[cn.nod])
        pq.push({cn.c + y.second, {cn.nod, y.first}});
    }
  }

  for(int i = 2; i <= n; i++)
    if(dmin[i] == INF)
      printf("0");
    else
      printf("%lld ", dmin[i]);

  return 0;
}