Cod sursa(job #2890887)

Utilizator NutaAlexandruASN49K NutaAlexandru Data 16 aprilie 2022 22:02:43
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#import<fstream>
#import<vector>
#import<algorithm>
#import<cstring>
#import<queue>
#import<unordered_set>
#import<string>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
struct sortt
{
    bool operator()(pair<int,int>a,pair<int,int>b)
    {
        return (a.first>=b.first);
    }
};
main()
{
    int tt;
    cin>>tt;
    while(tt--)
    {
        vector<vector<pair<int,int>>>a;
        int n,m,s;
        cin>>n>>m>>s;
        vector<int>rez,r;
        a.resize(n+1);
        rez.resize(n+1);
        r.resize(n+1);
        for(int i=1;i<=n;i++)
        {
            cin>>r[i];
            rez[i]=2e9;
        }
        rez[s]=0;
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            cin>>x>>y>>z;
            a[x].push_back({z,y});
            a[y].push_back({z,x});
        }
        priority_queue<pair<int,int>,vector<pair<int,int>>,sortt>q;
        q.push({0,s});
        while(!q.empty())
        {
            auto c=q.top();
            q.pop();
            int slast=c.first,last=c.second;
            if(slast!=rez[last])
            {
                continue;
            }
            for(auto v:a[last])
            {
                if(rez[v.second]>slast+v.first)
                {
                    rez[v.second]=slast+v.first;
                    q.push({rez[v.second],v.second});
                }
            }
        }
        bool ok=1;
        for(int i=1;i<=n;i++)
        {
            if(rez[i]==2e9)
            {
                rez[i]=0;
            }
            if(rez[i]!=r[i])
            {
                ok=0;
            }
        }
        if(ok)
        {
            cout<<"DA";
        }
        else
        {
            cout<<"NU";
        }
        cout<<'\n';
    }
}