Cod sursa(job #3176522)

Utilizator PiciuAndreiAlinPiciu Andrei Alin PiciuAndreiAlin Data 27 noiembrie 2023 11:25:47
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <bits/stdc++.h>
#define oo 2e9
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n, m, k, T;
vector< pair <int, int > >L[50005];
priority_queue< pair <int, int > >q;
int d[50005];
int a[50005];
bitset<50005>viz;
void Reset()
{
    viz.reset();
    for(int i = 1; i <= n; i++)
        L[i].clear();
}
void Dijkstra(int k)
{
    int i, cost;
    for(int i = 1; i <= n; i++)
        d[i] = oo;
    q.push({0, k});
    d[k] = 0;
    while(!q.empty())
    {
        k = q.top().second;
        q.pop();
        if(viz[k] == 0)
        {
            viz[k] = 1;
            for(auto e : L[k])
            {
                i = e.second;
                cost = e.first;
                if(d[i] > d[k] + cost)
                {
                    d[i] = d[k] + cost;
                    q.push({-d[i], i});
                }
            }
        }
    }
}
int Valid(int a[50005])
{
    for(int i = 1; i <= n; i++)
        if(a[i] != d[i])return 0;
    return 1;
}
void Citire()
{
    int i, k, x, y, c;
    fin >> n >> m >> k;
    for(i = 1; i <= n; i++)
    {
        fin >> a[i];
    }
    for(i = 1; i <= m; i++)
    {
        fin >> x >> y >> c;
        L[x].push_back({c, y});
        L[y].push_back({c, x});
    }
    Dijkstra(k);
    if(Valid(a) == 1)fout << "DA" << "\n";
    else fout << "NU" << "\n";
}
int main()
{
    fin >> T;
    while(T--)
    {
        Citire();
        Reset();
    }
    return 0;
}