Cod sursa(job #1706744)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 23 mai 2016 08:19:44
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#define oo 0x3f3f3f3f
#define NMax 50010

using namespace std;

int N, M;
int T[NMax];
bool expanded[NMax];
vector< pair<int, int> > ad[NMax];
priority_queue< pair<int, int> > q;

void dijkstra( int start ) {

    q.push({0, start});

    memset(T, 0x3f, sizeof(T));
    memset(expanded, 0, sizeof(expanded));
    T[start] = 0;

    while ( !q.empty() ) {

        int nod = q.top().second; q.pop();

        if ( expanded[nod] ) continue;
        expanded[nod] = true;

        for ( int i = 0; i < (int) ad[nod].size(); ++ i )
            if ( T[ad[nod][i].first] > T[nod] + ad[nod][i].second ) {
                T[ad[nod][i].first] = T[nod] + ad[nod][i].second;
                q.push({-T[ad[nod][i].first], ad[nod][i].first});
            }
    }

}


int main() {

    freopen("dijkstra.in", "r", stdin);
    freopen("dijkstra.out", "w", stdout);

    scanf("%d%d", &N, &M);

    for ( int i = 1; i <= M; ++ i ) {
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        ad[x].push_back({y, c});
    }

    dijkstra(1);

    for ( int i = 1; i <= N; ++ i )
    T[i] = T[i] == oo ? 0 : T[i];

    for ( int i = 2; i <= N; ++ i )
        printf("%d ", T[i]);
    printf("\n");

    return 0;
}