Cod sursa(job #3156280)

Utilizator lefterache_stefanLefterache Stefan lefterache_stefan Data 11 octombrie 2023 00:40:11
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

typedef pair<int, int> pi;

ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

const int INF = 1e9 + 1;
const int MARIME = 60005;

int n, m, start = 1, dist[MARIME];
bool vizitat[MARIME];

struct cmp {
    bool operator()(int &a, int &b) {
        return dist[a] > dist[b];
    }
};

priority_queue<int, vector<int>, cmp> pq;
vector<pi> graf[MARIME];

int main() {
    // citire si pregatire
    fin >> n >> m;
    for (int i = 0; i <= n; i++) {
        dist[i] = INF;
    }
    dist[start] = 0;
    pq.push(start);
    for (int i = 1; i <= m; i++) {
        int x, y, d;
        fin >> x >> y >> d;
        graf[x].push_back(make_pair(y, d));
        // graf[y].push_back(make_pair(x, d));
    }
    // dijkstra
    while (!pq.empty()) {
        int nod = pq.top();
        int cost = dist[nod];
        pq.pop();
        if (vizitat[nod]) {
            continue;
        }
        vizitat[nod] = true;
        for (unsigned int i = 0; i < graf[nod].size(); i++) {
            auto x = graf[nod][i];
            int vecin = x.first;
            if (cost + x.second >= dist[vecin]) {
                continue;
            }
            dist[vecin] = cost + x.second;
            pq.push(vecin);
        }
    }
    // afisare
    for (int i = 2; i <= n; i++) {
        fout << (dist[i] == INF ? 0 : dist[i]) << ' ';
    }
    return 0;
}