Cod sursa(job #2797022)

Utilizator mateitudordmDumitru Matei mateitudordm Data 9 noiembrie 2021 10:14:26
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <bits/stdc++.h>
#define inf 1000000

using namespace std;

int f[50001], res[50001];
struct dijkstra
{
    int nod, cost;
    bool operator<(const dijkstra &a) const
    {
        return cost > a.cost;
    }
};
priority_queue<dijkstra> pq;
vector<dijkstra> ad[50001];
void dik()
{
    int i;
    dijkstra a, aux;
    while (!pq.empty())
    {
        a.nod = pq.top().nod, a.cost = pq.top().cost;
        pq.pop();
        if (a.cost == f[a.nod])
        {
            for (i = 0; i < ad[a.nod].size(); i++)
            {
                if (f[ad[a.nod][i].nod] > a.cost + ad[a.nod][i].cost)
                {
                    aux.nod = ad[a.nod][i].nod;
                    aux.cost = a.cost + ad[a.nod][i].cost;
                    f[aux.nod] = aux.cost;
                    pq.push(aux);
                }
            }
        }
    }
}

int main()
{
    ifstream cin("distante.in");
    ofstream cout("distante.out");
    int t, n, m, a, b, c, i, j, s, ok = 0;
    dijkstra aux;
    cin >> t;
    while (t)
    {
        cin >> n >> m >> s;
        for (i = 1; i <= n; i++)
        {
            cin >> res[i];
            f[i] = inf;
            ad[i].clear();
        }
        for (i = 0; i < m; i++)
        {
            cin >> a >> b >> c;
            aux.cost = c;
            aux.nod = b;
            ad[a].push_back(aux);
            aux.nod = a;
            ad[b].push_back(aux);
        }
        aux.nod = s, aux.cost = 0;
        f[s] = 0;
        pq.push(aux);
        dik();
        ok = 0;
        for (i = 1; i <= n; i++)
        {
            if (f[i] == inf)
                f[i] = 0;
            if (f[i] != res[i])
                ok = 1;
        }
        if (ok == 0)
            cout << "DA" << '\n';
        else
            cout << "NU" << '\n';
        t--;
    }
    return 0;
}