Cod sursa(job #3241346)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 29 august 2024 13:16:49
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <bits/stdc++.h>

const std :: string FILENAME = "distante";

std :: ifstream in (FILENAME + ".in");

std :: ofstream out (FILENAME + ".out");

const int NMAX = 5e4 + 5;

const int INF = 1e9;

int t;

int n;

int m;

int s;

int x;

int y;

int d;

bool ok;

int dist[NMAX];

int dp[NMAX];

std :: vector <std :: pair <int, int>> v[NMAX];

std :: priority_queue <std :: pair <int, int>> pq;

std :: bitset <NMAX> visited;

void dijkstra()
{
    while(!pq.empty())
    {
        int nod = pq.top().second;

        pq.pop();

        if(visited[nod] == false)
        {
            visited[nod] = true;

            for(auto & i : v[nod])
            {
                if(dp[nod] + i.second < dp[i.first])
                {
                    dp[i.first] = dp[nod] + i.second;

                    pq.push(std :: make_pair(-dp[i.first], i.first));
                }
            }
        }
    }
}

int main()
{

    in >> t;

    while(t --)
    {
        in >> n >> m >> s;

        for(int i = 1; i <= n; i ++)
        {
            v[i].clear();

            in >> dist[i];
        }

        visited &= 0;

        for(int i = 1; i <= m; i ++)
        {
            in >> x >> y >> d;

            v[x].push_back(std :: make_pair(y, d));

            v[y].push_back(std :: make_pair(x, d));
        }

        std :: fill(dp + 1, dp + n + 1, INF);

        dp[s] = 0;

        pq.push(std :: make_pair(0, s));

        dijkstra();

        ok = true;

        for(int i = 1; i <= n; i ++)
        {
            if(dp[i] != dist[i])
            {
                out << "NU" << '\n';

                ok = false;

                break;
            }
        }

        if(ok)
        {
            out << "DA" << '\n';
        }
    }

    return 0;
}