Cod sursa(job #2021209)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 12 septembrie 2017 21:25:37
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
# include <bits/stdc++.h>
# define per pair <int, int>

using namespace std;

const int inf = INT_MAX, Nmax = 5 * 1e5 + 5;

int T, i, n, m, father, x, y, z, Distance[Nmax], query[Nmax];
vector < pair <int, int> > G[Nmax];

void dijkstra (int father)
{
    priority_queue < per, vector < per >, greater < per > > pq;
    int cost, node;

    for (i = 1; i <= n; Distance[i] = inf, ++i);

    Distance[father] = 0, pq.push({0, father});

    while (pq.size())
    {
        per current = pq.top();
        cost = current.first, node = current.second, pq.pop();

        if (cost != Distance[node]) continue;

        for (auto &it: G[node])
        {
            if (it.second + cost >= Distance[it.first]) continue;
            Distance[it.first] = it.second + cost;
            pq.push({Distance[it.first], it.first});
        }
    }

}

int main ()
{
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);

    scanf("%d\n", &T);

    for (; T; --T)
    {
        scanf("%d %d %d\n", &n, &m, &father);

        for (i = 1; i <= n; ++i)
            scanf("%d ", &query[i]);

        for (i = 1; i <= m; ++i)
        {
            scanf("%d %d %d\n", &x, &y, &z);
            G[x].push_back({y, z});
        }

        dijkstra(father);

        bool ans = true;

        for (i = 1; i <= n; ++i)
            if (Distance[i] != query[i])
            {
                ans = false;
                break;
            }

        if (ans) printf("DA\n");
        else printf("NU\n");

    }

    return 0;

}