Cod sursa(job #2206081)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 21 mai 2018 00:04:35
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 1e5
using namespace std;

void read(int &n, int &m, vector<vector<pair<int,int>>> &G) {
    ifstream fin("dijkstra.in");
    if (!fin.is_open()) {
        cout << "The file can't be opened!\n";
        exit(EXIT_FAILURE);
    }

    fin >> n >> m;
    G.resize(n + 1);
    for (int i = 0; i < m; ++i) {
        int x, y, cost;
        fin >> x >> y >> cost;
        G[x].emplace_back(y, cost);
        G[y].emplace_back(x, cost);
    }

    fin.close();
}

void dijkstra(int n, vector<vector<pair<int, int>>> G) {
    vector<int> d(n + 1, INF);
    vector<int> viz(n + 1, 0);
    vector<int> tata(n + 1, 0);

    d[1] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;
    Q.push({d[1], 1});
    while (!Q.empty()) {
        int u = Q.top().second;
        Q.pop();
        if (viz[u] == 0) {
            for (auto it : G[u]) {
                int v = it.first;
                int Wuv = it.second;
                if(viz[v] == 0 && d[u] + Wuv < d[v]) {
                    d[v] = d[u] + Wuv;
                    tata[v] = u;
                    Q.push({d[v], v});
                }
            }

            viz[u] = 1;
        }
    }

    ofstream fout("dijkstra.out");
    for (int i = 2; i <= n; ++i) {
        if (d[i] == INF)
            fout << 0 << ' ';
        else
            fout << d[i] << ' ';
    }
    fout.close();
}

int main() {
    int n, m;
    vector<vector<pair<int, int>>> G;
    read(n, m, G);
    dijkstra(n, G);
    return 0;
}