Cod sursa(job #2276392)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 4 noiembrie 2018 17:58:08
Problema Distante Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <bits/stdc++.h>
#define mama pair <int, int>
#define NMax 50005
#define mp make_pair

using namespace std;

ifstream f ("distante.in");
ofstream g ("distante.out");

vector <mama> G[NMax];
priority_queue <mama, vector <mama>, greater<mama> > H;

int t, n, m, s, x, y, c, nr;

long long brsol[NMax];

long long sol[NMax];

bool viz[NMax];

int main()
{
    f >> t;

    for (; t; t--)
    {
        f >> n >> m >> s;

        for (int i = 1; i <= n; i++)
            f >> brsol[i];

        for (int i = 1; i <= m; i++)
        {
            f >> x >> y >> c;
            G[x].push_back(mp(c, y));
            G[y].push_back(mp(c, x));
        }

        for (int i = 1; i <= n; i++) {
            viz[i] = false;
            sol[i] = -1;
        }

        for (int i = 0; i < G[s].size(); i++)
        {
            H.push(G[s][i]);
            sol[G[s][i].second] = G[s][i].first;
        }

        nr = G[s].size();
        sol[s] = 0;

        while (nr != 0)
        {
            while (viz[H.top().second] == true)
            {
                H.pop();
            }

            viz[H.top().second] = true;
            int t = H.top().second;
            H.pop();
            nr--;

            for (int i = 0; i < G[t].size(); i++)
            {
                int j = G[t][i].second;
                if (sol[j] == -1)
                {
                    nr++;
                    sol[j] = sol[t] + G[t][i].first;
                    H.push(mp(sol[j], j));
                }
                else if (sol[j] > sol[t] + G[t][i].first)
                {
                    sol[j] = sol[t] + G[t][i].first;
                    H.push({sol[j], j});
                }
            }
        }

        bool ok = true;
        for (int i = 1; i <= n && ok == true; i++)
        {
            if (sol[i] != brsol[i])
            {
                ok = false;
            }
        }

        if (ok == false) g << "NU" << '\n';
        else g << "DA" << '\n';

        for (int i = 1; i <= n; i++)
            G[i].clear();
    }
    return 0;
}