Cod sursa(job #1923069)

Utilizator alinp25Alin Pisica alinp25 Data 10 martie 2017 20:32:37
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <set>
#include <iostream>


#define inf 0x3f3f3f3f


typedef std::pair < int, int > iPair;


void read(std::vector < iPair > v[], int &n) {
    std::ifstream fin("dijkstra.in");
    int x, y, w, m;
    fin >> n >> m;
    for (int i = 0; i < m; i++) {
        fin >> x >> y >> w;
        v[x].push_back(std::make_pair(y, w));
    }
    fin.close();
}


void printSol(std::vector < int > d, int n) {
    std::ofstream fout("dijkstra.out");
    for (int i = 2; i <= n; i++) {
        if (d[i] == inf) {
            fout << "0 ";
        } else {
            fout << d[i] << " ";
        }
    }
    fout.close();
}


void solve(std::vector < iPair > v[], std::vector < int > &d, int n) {
    int node, next, cost;
    std::set < iPair > h;
    d[1] = 0;
    h.insert(std::make_pair(1, 0));
    while (!h.empty()) {
        node = h.begin()->first;
        h.erase(h.begin());
        for (int i = 0; i < v[node].size(); i++) {
            next = v[node][i].first;
            cost = v[node][i].second;
            if (d[next] > d[node] + cost) {
                if (d[next] != inf) {
                    h.erase(h.find(std::make_pair(next, d[next])));
                }
                d[next] = d[node] + cost;
                h.insert(std::make_pair(next, d[next]));
            }
        }
    }
}


int main(int argc, char *argv[]) {
    int n;
    std::vector < int > d(50001, inf);
    std::vector < iPair > v[50001];
    read(v, n);
    solve(v, d, n);
    printSol(d, n);
    return 0;
}