Cod sursa(job #3367028)

Utilizator Xutzu358Ignat Alex Xutzu358 Data 5 octombrie 2026 18:55:36
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>

using namespace std;

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

long long inf = 50000005;
bool ok;
int nr, n, m, x, d1[50005], d[50005];
vector <pair<int, int>> l[50005];
set <pair<int, int>> s;

void dijkstra (int x)
{
    s.insert({0, x});
    d[x] = 0;
    while (!s.empty())
    {
        pair <int, int> p = *s.begin();
        s.erase(s.begin());
        for (auto i:l[p.second])
        {
            if (d[i.second] > d[p.second] + i.first)
            {
                s.erase({d[i.second], i.second});
                d[i.second] = d[p.second] + i.first;
                s.insert({d[i.second], i.second});
            }
        }
    }
}

int main()
{
    int a, b, c;
    in >> nr;
    for (int k = 1; k <= nr; k++)
    {
        in >> n >> m >> x;
        for (int i=1;i<=n;i++)
        {
            l[i].clear();
        }
        for (int i = 1; i <= n; i++)
            in >> d1[i];
        for (int i = 1; i <= m; i++)
        {
            in >> a >> b >> c;
            l[a].push_back({c, b});
            l[b].push_back({c, a});
        }
        for (int i = 1; i <= n; i++)
            d[i] = inf;
        dijkstra(x);
        ok = 0;
        for (int i = 1; i <= n; i++)
        {
            if (d1[i] != d[i])
            {
                out << "NU\n";
                ok = 1;
                break;
            }
        }
        if (ok == 0)
            out << "DA\n";
    }

    return 0;
}