Cod sursa(job #1882314)

Utilizator goalexboxerFMI Alexandru Ionascu goalexboxer Data 17 februarie 2017 09:13:03
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define in f
#define out g
using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

const int INF = 2e9;
const int MAX_SIZE = 2e5 + 10;
auto cmp = [](pair<int, int> a, pair<int, int> b) -> bool {
  return a.second > b.second;
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> Q(cmp);
vector<pair<int, int>> G[MAX_SIZE];
int n, m;
int dist[MAX_SIZE];
bool visited[MAX_SIZE];

void read() {
  in >> n;
  in >> m;
  int x, y, z;
  for (int i = 1; i <= m; i++) {
    in >> x;
    in >> y;
    in >> z;
    G[x].push_back({y, z});
  }
}

void dijkstra(int vertex) {
  for (int i = 1; i <= n; i++)
    dist[i] = INF;
  dist[vertex] = 0;
  visited[vertex] = true;
  Q.push({vertex, 0});
  while (!Q.empty()) {
    pair<int, int> current = Q.top();
    Q.pop();
    for (auto adj : G[current.first]) {
      if (!visited[adj.first] &&
          dist[current.first] + adj.second < dist[adj.first]) {
        dist[adj.first] = dist[current.first] + adj.second;
        Q.push({adj.first, dist[adj.first]});
        visited[current.first] = true;
      }
    }
  }

  for (int i = 1; i <= n; i++) {
    if (i != vertex) {
      out << dist[i] << " ";
    }
  }
}

int main() {
  read();
  dijkstra(1);
  return 0;
}