Cod sursa(job #2971145)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 26 ianuarie 2023 18:54:18
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <set>
#include <climits>
#include <vector>
#define inf LLONG_MAX
#include <utility>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");

struct muchie{
    int x, c;
};

long long d[50001], sol[50001];
set <pair<long long, int>>s;
vector <muchie> l[50001];

int main()
{
    int t, m, n, xs, i, j, cost, nod, x, y, c, vecin;
    fin>>t;
    while(t)
    {
        t--;
        fin>>n>>m>>xs;
        for(i=1;i<=n;i++)
        {
            fin>>sol[i];
        }
        for(i=1;i<=m;i++)
        {
            fin>>x>>y>>c;
            l[x].push_back({y, c});
            l[y].push_back({x, c});
        }
        for(i=1;i<=n;i++)
        {
            d[i]=inf;
        }
        d[xs]=0;
        s.insert(make_pair(0, xs));
        while(s.empty()==0)
        {
            nod=s.begin()->second;
            s.erase(s.begin());
            for(i=0;i<l[nod].size();i++)
            {
                vecin=l[nod][i].x;
                cost=l[nod][i].c;
                if(d[vecin]>d[nod]+cost)
                {
                    s.erase(make_pair(d[vecin], vecin));
                    d[vecin]=d[nod]+cost;
                    s.insert(make_pair(d[vecin], vecin));
                }
            }
        }
        s.clear();
        for(i=1;i<=n;i++)
        {
            l[i].clear();
        }
        int ok=1;
        for(i=1;i<=n;i++)
        {
            if(sol[i]!=d[i])
            {
                ok=0;
                break;
            }
        }
        if(ok==1)
        {
            fout<<"DA"<<"\n";
        }
        else
        {
            fout<<"NU"<<"\n";
        }
    }
}