Cod sursa(job #1509311)

Utilizator timicsIoana Tamas timics Data 23 octombrie 2015 18:25:56
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
#define fs first
#define sc second
#define mp make_pair
using namespace std;
int M,x,y,z;

#define inf 2000000000
int N, d[50010], viz[50010];
vector<pair<int,int> > m[50010];
priority_queue<pair<int,int> > pq;

void dijkstra(int r) {
    for(int i=1;i<=N;++i) {
        d[i] = inf;
    }
    d[r] = 0;
    pq.push(mp(0,r));
    while(!pq.empty()) {
        int x = pq.top().sc;
        pq.pop(); viz[x] = 1;
        for(auto a: m[x]) {
            int y = a.fs;
            int c = a.sc;
            if(!viz[y]) {
                if(d[y] > c + d[x]) {
                    d[y] = c + d[x];
                    pq.push(mp(-d[y],y));
                }
            }
        }
    }
}

int main() {
    freopen("dijkstra.in","r",stdin);
    freopen("dijkstra.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int i=1;i<=M;++i) {
        scanf("%d%d%d",&x,&y,&z);
        m[x].push_back(mp(y,z));
    }
    dijkstra(1);
    for(int i=2;i<=N;++i) {
        if(d[i]!=inf) {
            printf("%d ",d[i]);
        } else {
            printf("0 ");
        }
    }
    return 0;
}