Cod sursa(job #3128317)

Utilizator LucianPandelicaPandelica Lucian LucianPandelica Data 9 mai 2023 11:31:37
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 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 main()
{
    f >> T;

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

        for (int p = 1; p <= N; p++) {
            f >> dist_in[p];
        }

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

        vector<int> d(N + 1);
        vector<int> p(N + 1);

        for (int i = 1; i <= N; i++) {
            d[i] = INF; 
            p[i] = -1;
        }

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

        d[S] = 0;
        p[S] = -1;
        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;
                    p[adj[node][i].first] = node;

                    pq.push(make_pair(d[adj[node][i].first], adj[node][i].first));
                }
            }
        }

        bool is_not = false;

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

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

    return 0;
}