Cod sursa(job #3300727)

Utilizator Tudor_CCTudor Cocu Tudor_CC Data 18 iunie 2025 18:03:28
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <bits/stdc++.h>

using namespace std;

vector <int> s[50005];
vector <int> p[50005];

int d[50005];

int pr[50005];

priority_queue <pair<int,int>,vector<pair<int,int>>,greater<>> q;

int main()
{
    ifstream cin("distante.in");
    ofstream cout("distante.out");
    int t,n,m,ss,x,y,c;
    cin>>t;
    for(int h=1;h<=t;++h)
    {
        cin>>n>>m>>ss;
        for(int i=1;i<=n;++i)
        {
            pr[i]=INT_MAX;
            s[i].clear();
            p[i].clear();
        }
        for(int i=1;i<=n;++i)
        {
            cin>>d[i];
        }
        for(int i=1;i<=m;++i)
        {
            cin>>x>>y>>c;
            s[x].push_back(y);
            s[y].push_back(x);
            p[x].push_back(c);
            p[y].push_back(c);
        }
        pr[ss]=0;
        q.emplace(0,ss);

        while(q.size())
        {
            int price,pnt;
            price=q.top().first;
            pnt=q.top().second;
            if(price>pr[pnt])
            {

            }
            else
            {

            for(int i=0;i<s[pnt].size();++i)
            {
                int pri,ngb;
                ngb=s[pnt][i];
                pri=price+p[pnt][i];
                if(pri<pr[ngb])
                {
                    pr[ngb]=pri;
                    q.emplace(pri,ngb);
                }
            }
            }
            q.pop();
        }
        bool ok=true;
        for(int i=1;i<=n;++i)
        {
           // cout<<pr[i]<<" ";
            if(d[i]!=pr[i])
            {
                ok=false;
                break;
            }
        }
        if(ok==true)
        {
            cout<<"DA";
        }
        else
        {
            cout<<"NU";
        }
        cout<<"\n";
    }
    return 0;
}