Cod sursa(job #3213321)

Utilizator Chris_BlackBlaga Cristian Chris_Black Data 12 martie 2024 21:31:27
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>
#define int long long
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define FORR(i, a, b) for(int i = a; i >= b; --i)
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using pii = pair<int, int>;
#define ff first
#define ss second
#define pb push_back
using vpi = vector<pii>;
using vvpi = vector<vpi>;

const string TASK("distante");
ifstream fin(TASK + ".in");
ofstream fout(TASK + ".out");
#define cin fin
#define cout fout

const int N = 5e4 + 9;
const int Inf = 0x3f3f3f3f;


void solve()
{
    int n, m, s;
    cin >> n >> m >> s;

    vi testd(n + 1);
    FOR(i, 1, n)cin >> testd[i];

    vvpi G(n + 1);
    int u, v, c;
    FOR(i, 1, m)
    {
        cin >> u >> v >> c;
        G[u].pb({v, c});
        G[v].pb({u, c});
    }

    vi d(n + 1, Inf);
    d[s] = 0;
    priority_queue<pii> q;q.push({0, s});

    while(!q.empty())
    {
        int dx = q.top().ff, x = q.top().ss;
        q.pop();

        if(-dx > d[x])continue;

        for(auto [y, c] : G[x])
            if(d[y] > d[x] + c)
                q.push({- (d[y] = d[x] + c), y});
    }

    bool ok = true;
    FOR(i, 1, n)if(testd[i] != d[i])ok = false;

    if(ok)cout << "DA\n";
    else cout << "NU\n";
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    while(t --)
        solve();
    return 0;
}