Cod sursa(job #3355800)

Utilizator VladStroicaStroica Vlad Cristian VladStroica Data 26 mai 2026 10:59:16
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

#define cin fin
#define cout fout
#define int long long
using namespace std;

ifstream cin("distante.in");
ofstream cout("distante.out");
int n,m,t;
int comp[50005];
int rez[50005];
signed main()
{
    cin>>t;

    for(int y=1; y<=t; y++)
    {
        int s;
        cin>>n>>m>>s;
        for(int i=1;i<=n;i++)
            cin>>comp[i];
        vector<vector<pair<int,int>>>vc;
        vc.resize(n+1);
        for(int i=1; i<=n; i++)
            rez[i]=5000000005ll;
        for(int i=1; i<=m; i++)
        {
            int mds,mds2,val;
            cin>>mds>>mds2>>val;
            vc[mds].push_back({mds2,val});
            vc[mds2].push_back({mds,val});
        }
        rez[s]=0;
        priority_queue<pair<int,int>, vector <pair<int, int>>>q;
        q.push({0,s});
        while(!q.empty())
        {
            int vl=q.top().first*-1;
            int poz=q.top().second;
            q.pop();
            if(vl!=rez[poz])
                continue;
            for(int i=0; i<vc[poz].size(); i++)
            {
                int poz2=vc[poz][i].first;
                if(rez[poz2]>vl+vc[poz][i].second)
                {
                    rez[poz2]=vl+vc[poz][i].second;
                    q.push({-rez[poz2],poz2});
                }
            }
        }
        int ok=0;
        for(int i=1;i<=n;i++)
        {
            if(rez[i]!=comp[i])
            {
                ok++;
                break;
            }

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

    return 0;
}