Cod sursa(job #2653900)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 29 septembrie 2020 15:31:01
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <bits/stdc++.h>
#define INF 2000000000

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int T,n,m,start,i,x,y,z,val[50005],d[50005];
vector< pair<int, int> > L[50005];
set< pair<int, int> > s;

int main()
{
    fin >> T;
    for (;T--;)
    {
        fin >> n >> m >> start;
        for (i=1; i<=n; i++)
            fin >> val[i];
        for (i=1; i<=n; i++)
            L[i].clear();
        for (i=1; i<=m; i++)
        {
            fin >> x >> y >> z;
            L[x].push_back({y, z});
            L[y].push_back({x, z});
        }
        for (i=1; i<=n; i++)
            d[i] = INF;
        s.clear(); s.insert({0, start}); d[start] = 0;
        while (!s.empty())
        {
            int nod = s.begin()->second; s.erase(s.begin());
            for (i=0; i<L[nod].size(); i++)
            {
                int vecin = L[nod][i].first; int cost = L[nod][i].second;
                if (d[nod]+cost < d[vecin])
                {
                    s.erase({d[vecin], vecin});
                    d[vecin] = d[nod]+cost;
                    s.insert({d[vecin], vecin});
                }
            }
        }
        int ok = 0;
        for (i=1; i<=n; i++)
            if (d[i] != val[i])
            {
                ok = 1;
                break;
            }
        if (!ok)
            fout << "DA\n";
        else
            fout << "NU\n";
    }
    return 0;
}