Cod sursa(job #3221446)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 7 aprilie 2024 10:48:06
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include<bits/stdc++.h>
#pragma GCC optimize("O3")

using namespace std;

const int NMAX = 5e4 + 5, INF = 1e9 + 7;
int n, m, dist[NMAX], ans[NMAX], s;
vector<pair<int, int>> v[NMAX];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
bool viz[NMAX];

void query()
{
    cin >> n >> m >> s;
    for(int i = 1; i <= n; i++)
        v[i].clear();
    int a, b, cost;
    for(int i = 1; i <= n; i++)
        cin >> dist[i];
    for(int i = 1; i <= m; i++)
    {
        cin >> a >> b >> cost;
        v[a].push_back({b, cost});
        v[b].push_back({a, cost});
    }

    for(int i = 1; i <= n; i++)
    {
        ans[i] = INF;
        viz[i] = 0;
    }
    q.push({0, s});
    while(!q.empty())
    {
        int nod = q.top().second, cost = q.top().first;
        q.pop();

        if(viz[nod])
            continue;
        viz[nod] = true;
        ans[nod] = cost;
        
        for(auto u : v[nod])
        {
            if(!viz[u.first] && ans[u.first] > cost + u.second)
            {
                ans[u.first] = cost + u.second;
                q.push({ans[u.first], u.first});
            }
        }
    }

    for(int i = 1; i <= n; i++)
    {
        if(ans[i] != dist[i])
        {
            cout << "NU";
            return;
        }
    }

    cout << "DA";
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);

    int t;
    cin >> t;
    while(t--)
    {
        query();
        cout << "\n";
    }
}