Cod sursa(job #3176472)

Utilizator alex_0747Gheorghica Alexandru alex_0747 Data 27 noiembrie 2023 10:38:33
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
#define N 50005
using namespace std;

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

vector <pair <int, int> > L[N];
int d[N], sol[N], n, m, s;
bitset <N> v;
priority_queue<pair<int, int> > q;

void Citire()
{
    int i, j, k, cost;
    fin >> n >> m >> s;
    for (i = 1; i <= n; i++)
        fin >> d[i];
    for (k = 1; k <= m; k++)
    {
        fin >> i >> j >> cost;
        L[i].push_back({j, cost});
        L[j].push_back({i, cost});
    }
}

void Dijkstra(int P)
{
    int i, nod, cost;
    for (i = 1; i <= n; i++)
        sol[i] = 2e9;
    sol[P] = 0;
    q.push({0, P});
    while (!q.empty())
    {
        P = q.top().second;
        q.pop();
        if (v[P]) continue;
        v[P] = 1;
        for (auto e : L[P])
        {
            nod = e.first;
            cost = e.second;
            if (sol[nod] > sol[P] + cost)
            {
                sol[nod] = sol[P] + cost;
                q.push({-sol[nod], nod});
            }
        }
    }
}

bool Verif()
{
    for (int i = 1; i <= n; i++)
        if (d[i] != sol[i])
            return 0;
    return 1;
}

void Reset()
{
    v.reset();
    for (int i = 1; i < N; i++)
        L[i].clear();
}

int main()
{
    int q;
    fin >> q;
    while (q--)
    {
        Citire();
        Dijkstra(s);
        if (Verif()) fout << "DA\n";
        else fout << "NU\n";
        Reset();
    }
    return 0;
}