Cod sursa(job #3212265)

Utilizator DKMKDMatei Filibiu DKMKD Data 11 martie 2024 15:06:11
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 50005;
const int INF = 0x3f3f3f3f;

int T;
int dist[NMAX], distAUX[NMAX];
int n, m, S;
vector<pair<int, int>>g[NMAX];
void Dijkstra(int start) {
    for (int i = 1; i <= n; ++i)
        distAUX[i] = INF;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>pq;
    distAUX[start] = 0;
    pq.push({ 0,start });
    while (!pq.empty()) {
        int nod = pq.top().second;
        int distanta = pq.top().first;
        pq.pop();
        for (auto i : g[nod]) {
            int distanta_nod = i.first;
            int nod_urm = i.second;
            if (distanta + distanta_nod < distAUX[nod_urm]) {
                distAUX[nod_urm] = distanta + distanta_nod;
                pq.push({ distanta + distanta_nod,nod_urm });
            }
        }
    }
}
int main() {
    fin >> T;
    while (T--) {
        memset(dist, 0, sizeof(dist));
        memset(distAUX, 0, sizeof(distAUX));
        for (int i = 0; i < NMAX; ++i)
            g[i].clear();
        fin >> n >> m >> S;
        for (int i = 1; i <= n; ++i)
            fin >> dist[i];
        for (int i = 1; i <= m; ++i) {
            int x, y, c;
            fin >> x >> y >> c;
            g[x].push_back({ c,y });
            g[y].push_back({ c,x });
        }
        Dijkstra(S);
        bool ok = true;
        for (int i = 1; i <= n; ++i)
            if (dist[i] != distAUX[i]) {
                ok = false;
                break;
            }
        if (!ok)
            fout << "NU" << "\n";
        else fout << "DA" << "\n";
    }
    return 0;
}