Cod sursa(job #1966282)

Utilizator mariakKapros Maria mariak Data 15 aprilie 2017 07:58:02
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define maxN 50002
#define pii pair <int, int>
#define mp make_pair
#define inf (1 << 30)

FILE *fin  = freopen("dijkstra.in", "r", stdin);
FILE *fout = freopen("dijkstra.out", "w", stdout);

using namespace std;
int N, M;
struct comp{
    bool operator () (const pii &a, const pii &b){
        return a.second > b.second;
    }
};
vector <pii> G[maxN];
priority_queue <pii, vector <pii>, comp> pq;
bitset <maxN> used;
int d[maxN];

void dijkstra(){
    while(pq.size()){
        pii p = pq.top();
        int u = p.first;
        pq.pop();
        if(used.test(u)) continue;
        for(pii p : G[u]){
            int v = p.first, c = p.second;
            if(!used.test(v) && d[u] + c < d[v]){
                d[v] = d[u] + c;
                pq.push(mp(v, d[v]));
            }
        }
        used.set(u);
    }
}

int main(){
    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(mp(y, c));
        //G[y].push_back(mp(x, c));
    }

    for(int i = 2; i <= N; ++ i)
        d[i] = inf;

    pq.push(mp(1, 0));

    dijkstra();

    for(int i = 2; i <= N; ++ i)
        if(d[i] == inf)
            printf("0 ");
        else printf("%d ", d[i]);
    return 0;
}