Cod sursa(job #2971686)

Utilizator PatruMihaiPatru Mihai PatruMihai Data 27 ianuarie 2023 20:11:10
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 5e4 + 7;

struct muchie
{
    int cost, dest;
};


vector<int> dist(NMAX);

int main()
{
    int t;
    fin >> t;

    while (t--)
    {
        int n, m, start;
        fin >> n >> m >> start;

        for (int i = 1; i <= n; i++)
            fin >> dist[i];

        vector<vector<muchie>> v(NMAX);
        for(int i = 1; i <= m; i++)
        {
            int x, y, c;
            fin >> x >> y >> c;
            v[x].push_back({c, y});
            v[y].push_back({c, x});
        }

        vector<int> d(NMAX, INT_MAX);

        set<pair<int, int>> s;
        d[start] = 0;
        s.insert({0, start});

        while(!s.empty())
        {
            int nod = s.begin()->second;
            s.erase(s.begin());

            for(auto i : v[nod])
            {
                if(d[i.dest] > d[nod] + i.cost)
                {
                    s.erase({d[i.dest], i.dest});
                    d[i.dest] = d[nod] + i.cost;
                    s.insert({d[i.dest], i.dest});
                }
            }
        }

        bool ok = true;

        for(int i = 1; i <= n; i++)
        {
            if(dist[i] != d[i])
            {
                ok = false;
                break;
            }
        }

        fout << (ok ? "DA\n" : "NU\n");
    }
    return 0;
}