Cod sursa(job #2685429)

Utilizator raluca1234Tudor Raluca raluca1234 Data 16 decembrie 2020 21:51:05
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
 
using namespace std;

const int INF = 0x3f3f3f3f;

struct Graph {
  int n;
  vector<vector<pair<int, int>>> adj;
  
  Graph(int n) : n(n), adj(n) {}
 
  void AddEdge(int a, int b, int c) {
    adj[a].emplace_back(b, c);
  }
 
  vector<int> Dijkstra(int source) {
    vector<int> dist(n, INF);
    priority_queue<pair<int, int>> pq;
 
    pq.emplace(0, source);
 
    while (!pq.empty()) {
      int d, node; 
      tie(d, node) = pq.top(); 
      pq.pop();
      d = -d;
      
      if (d > dist[node]) continue;
 
      for (auto edge : adj[node]) {
        int nei, cost; 
        tie(nei, cost) = edge;

        if (d + cost < dist[nei]) {
          dist[nei] = d + cost;
          pq.emplace(-(d + cost), nei);
        }
      }
    }
 
    return dist;
  }
};
 
int main(){
  ifstream cin("dijkstra.in");
  ofstream cout("dijkstra.out");
  
  int n, m; 
  cin >> n >> m;
  
  Graph graph(n);
  
  for (int i = 0; i < m; ++i) {
    int a, b, c;
    cin >> a >> b >> c; --a; --b;

    graph.AddEdge(a, b, c);
  }
  
  vector<int> dist = graph.Dijkstra(0);
  for (int i = 1; i < n; ++i) {
    if (dist[i] == INF) {
      cout << "0 ";
    } else {
      cout << dist[i] << " ";
    }
  }
  cout << endl;

  return 0;
}