Cod sursa(job #3128324)

Utilizator LucianPandelicaPandelica Lucian LucianPandelica Data 9 mai 2023 11:46:40
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

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

#define INF (1 << 30)
typedef pair<int, int> iPair;

vector<pair<int, int>> adj[50001];
int T;
int N, M, S;
int dist_in[50001];
int d[50001];

int main()
{
    f >> T;

    for (int l = 1; l <= T; l++) {
        f >> N >> M >> S;

        for (int c = 1; c <= N; c++)
            f >> dist_in[c];
        
        for (int c = 1; c <= N; c++) {
            adj[c].clear();
        }
        
        for (int k = 1, x, y, w; k <= M; k++) {
            f >> x >> y >> w;
            adj[x].push_back({y, w});
        }

        for (int p = 1; p <= N; p++)
            d[p] = INF;

        priority_queue<iPair, vector<iPair>, greater<iPair> >
        pq;

        d[S] = 0;
        pq.push(make_pair(0, S));

        while (!pq.empty()){
            int node = pq.top().second;
            pq.pop();
    
            for(int i = 0; i < (int) adj[node].size(); i++) {
                if (d[node] + adj[node][i].second < d[adj[node][i].first]) {
                    d[adj[node][i].first] = d[node] + adj[node][i].second;
                    pq.push(make_pair(d[adj[node][i].first], adj[node][i].first));
                }
            }
        }

        bool is_not = false;

        for (int q = 1; q <= N; q++) {
            if(dist_in[q] != d[q]) {
                is_not = true;
                g << "NU\n";
                break;
            }
        }

        if (is_not == false)
            g << "DA\n";
    }

    return 0;
}