Cod sursa(job #3313991)

Utilizator Tudor28Ceclan Tudor Tudor28 Data 7 octombrie 2025 18:46:47
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int oo = (1 << 30);
bool solve(vector<vector<pair<int, int>>> &g, int s, vector<int> &p, int n)
{

    vector<int> dist(n + 1, oo);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({0, s});
    while (!pq.empty())
    {
        auto x = pq.top();
        pq.pop();

        if (dist[x.second] != oo)
            continue;

        dist[x.second] = x.first;

        for (auto &y : g[x.second])
        {
            if (dist[y.first] == oo && dist[x.second] + y.second <= dist[y.first])
            {
                pq.push({dist[x.second] + y.second, y.first});
            }
        }
    }

    for (int i = 1; i <= n; i++)
    {
        if (p[i] != dist[i])
        {
            return false;
        }
    }
    return true;
}
int main()
{
    int t;
    fin >> t;
    while (t--)
    {

        int n, m, s;
        fin >> n >> m >> s;
        vector<int> p(n + 1);
        vector<vector<pair<int, int>>> g(n + 1);
        for (int i = 1; i <= n; i++)
        {
            fin >> p[i];
        }
        for (int i = 0; i < m; i++)
        {
            int a, b, c;
            fin >> a >> b >> c;
            g[a].push_back({b, c});
            g[b].push_back({a, c});
        }
        if (solve(g, s, p, n))
        {
            fout << "DA\n";
        }
        else
        {
            fout << "NU\n";
        }
    }
    return 0;
}