Cod sursa(job #3128315)

Utilizator AlexAlAxAxelAxenia Alexandru AlexAlAxAxel Data 9 mai 2023 11:30:52
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

const int nlim = 50005;
const int oo = 1 << 30;
int n, m, nodstart, D[nlim], InCoada[nlim], expected[nlim];
vector<pair<int, int>> muchii[nlim];

struct comp {
    bool operator()(int x, int y) { return D[x] > D[y]; }
};

void Dijkstra(int nodstart) {
    priority_queue<int, vector<int>, comp> coada;
    for (int i = 1; i <= n; i++)
        InCoada[nlim] = 0;

    coada.push(nodstart);
    InCoada[nodstart] = 1;
    D[nodstart] = 0;
    while (!coada.empty()) {
        int nod = coada.top();
        coada.pop();
        InCoada[nod] = 0;
        for (int i = 0; i < muchii[nod].size(); i++) {
            int vecin = muchii[nod][i].first;
            int cost = muchii[nod][i].second;
            if (D[nod] + cost < D[vecin]) {
                D[vecin] = D[nod] + cost;
                if (InCoada[vecin] == 0) {
                    coada.push(vecin);
                    InCoada[vecin] = 1;
                }
            }
        }
    }

    bool ok = true;
    for (int i = 1; i <= n; i++)
        if (D[i] != expected[i]) {
            ok = false;
            break;
        }

    if (ok == true)
        g << "DA\n";
    else
        g << "NU\n";
}

void citire() {
    f >> n >> m >> nodstart;

    for (int i = 1; i <= n; i++)
        f >> expected[i];

    for (int i = 1; i <= n; i++)
        muchii[i].clear();

    int x, y, c;
    for (int i = 1; i <= m; i++) {
        f >> x >> y >> c;
        muchii[x].push_back(make_pair(y, c));
    }
    for (int i = 1; i <= n; i++)
        D[i] = oo;
}

int main() {
    int T;
    f >> T;
    for (int i = 1; i <= T; i++) {
        citire();
        Dijkstra(nodstart);
    }

    return 0;
}