Cod sursa(job #1789195)

Utilizator deividFlorentin Dumitru deivid Data 26 octombrie 2016 19:26:33
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <vector>
#include <set>

#define maxdim 50005

using namespace std;

int n, m;
int dist[maxdim];
vector<pair<int, int>> G[maxdim];
set<pair<int, int>> S;

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

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

  for (int i = 2; i <= n; ++i) {
    dist[i] = 1 << 30;
  }
  S.insert(make_pair(1, dist[1]));
  while (!S.empty()) {
    auto p = *(S.begin());
    int nod = p.first, cost = p.second;
    S.erase(S.begin());
    if (cost != dist[nod]) {
      continue;
    }

    for (auto &v : G[nod]) {
      if (dist[v.first] > dist[nod] + v.second) {
        dist[v.first] = dist[nod] + v.second;
        S.insert(make_pair(v.first, dist[v.first]));
      }
    }
  }

  for (int i = 2; i <= n; ++i) {
    if (dist[i] == (1 << 30)) {
      dist[i] = 0;
    }
    printf("%d ", dist[i]);
  }
  printf("\n");

  return 0;
}