Cod sursa(job #1822524)

Utilizator msciSergiu Marin msci Data 5 decembrie 2016 02:26:29
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <vector>
#include <queue>
#include <set>

using namespace std;

static const int INF = 0x3f3f3f3f;

int N, M;
int d[50005];
vector<pair<int, int> > adj[50005];

void dijkstra(int v) {
    for (int i = 1; i <= N; i++) d[i] = INF;
    set<pair<int, int> > s;
    d[v] = 0;
    int u;
    s.insert({d[v], v});
    while (!s.empty()) {
        u = s.begin()->second;
        s.erase(s.begin());
        for (int i = 0; i < adj[u].size(); i++) {
            pair<int, int> p = adj[u][i];
            if (d[p.first] > d[u] + p.second) {
                s.erase({d[p.first], p.first});
                d[p.first] = d[u] + p.second;
                s.insert({d[p.first], p.first});
            }
        }
    }
}

int main() {
    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);
    scanf("%d %d", &N, &M);
    for (int i = 1; i <= N; i++) adj[i].reserve(N + 1);
    for (int i = 1; i <= M; i++) {
        int x, y, w;
        scanf("%d %d %d", &x, &y, &w);
        adj[x].push_back({y, w});
    }
    dijkstra(1);
    for (int i = 2; i <= N; i++) {
        printf("%d ", d[i]);
    }
    printf("%\n");
}