Cod sursa(job #1160478)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 30 martie 2014 16:08:34
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
#include <set>

#include <cstring>
using namespace std;

const int MAX_N = 50002;
const int INF = 0x3f3f3f3f;

int N, M;
int D[MAX_N];
vector < pair < int, int > > v[MAX_N];
set < pair < int, int > > H;

int main() {
    ifstream f("dijkstra.in");
    ofstream g("dijkstra.out");

    f >> N >> M;
    for(int i = 1, x, y, c; i <= M; ++i) {
        f >> x >> y >> c;
        v[x].push_back(make_pair(y, c));
    }

    memset(D, INF, sizeof(D));
    D[1] = 0;
    for(int i = 1; i <= N; ++i)
        H.insert(make_pair(D[i], i));
    
    while(!H.empty()) {
        int x = (*H.begin()).second, cost = (*H.begin()).first;
        H.erase(make_pair(cost, x));

        for(int i = 0; i < (int) v[x].size(); ++i) {
            int y = v[x][i].first, c = v[x][i].second;

            if(D[x] + c < D[y]) {
                H.erase(make_pair(D[y], y));

                D[y] = D[x] + c;
                H.insert(make_pair(D[y], y));
            }
        }
    }

    for(int i = 2; i <= N; ++i) {
        if(D[i] == INF)
            D[i] = 0;

        g << D[i] << " ";
    }
    g << "\n";

    f.close();
    g.close();

    return 0;
}