Cod sursa(job #1795533)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 2 noiembrie 2016 17:04:05
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <bitset>
#include <utility>

using namespace std;

#define DIM 50005
#define INF 2e9

vector <vector <pair <int, int> > > V;
priority_queue <int> MyQue;
bitset <DIM> MyBitset;
int d[DIM], N, M, x, y, cost;

int main() {
    FILE *fin = fopen("dijkstra.in","r");
    FILE *fout = fopen("dijkstra.out","w");

    fscanf(fin, "%d %d\n", &N, &M);

    V.resize(N + 2);

    for(int i = 1; i <= M; ++i) {
        fscanf(fin, "%d %d %d\n", &x, &y, &cost);

        V[x].push_back(make_pair(y, cost));
    }

    MyQue.push(1);

    for(int i = 2; i <= N; ++i) {
        d[i] = INF;
    }

    while(!MyQue.empty()) {
        int x = MyQue.top();
        MyQue.pop();

        while(!MyQue.empty() && MyBitset[x] == 1) {
            x = MyQue.top();
            MyQue.pop();
        }

        MyBitset[x] = 1;

        for(unsigned int i = 0; i < V[x].size(); ++i) {
            if(V[x][i].second + d[x] < d[V[x][i].first]) {
                d[V[x][i].first] = V[x][i].second + d[x];
                MyQue.push(V[x][i].first);
            }
        }
    }

    for(int i = 2; i <= N; ++i) {
        fprintf(fout, "%d ", (d[i] == INF ? 0 : d[i]));
    }

    fprintf(fout, "\n");

    return 0;
}