Cod sursa(job #2823464)

Utilizator bananamandaoneTudor Cosmin Oanea bananamandaone Data 28 decembrie 2021 16:11:30
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>
#define nmax 100003

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");

int n, m, s;
vector<int> b;
vector< pair<int, int> > h[nmax];

void dijkstra(int &start, vector<int> &d, vector<bool> &in_coada)
{
    int k, v, c;
    priority_queue< pair<int, int>, vector< pair<int, int> >, greater< pair<int, int> > > coada_muchii;
    coada_muchii.push({d[start], start});

    while(!coada_muchii.empty())
    {
        k = coada_muchii.top().second;
        coada_muchii.pop();
        in_coada[k] = false;

        for (auto w : h[k])
        {
            v = w.first;
            c = w.second;

            if(d[v] > d[k] + c)
            {
                d[v] = d[k] + c;

                if(!in_coada[v])
                {
                    coada_muchii.push({d[v], v});
                    in_coada[v] = true;
                }
            }
        }
    }
}

bool pb_dijkstra(int start)
{
    vector<int> d(nmax);
    vector<bool> in_coada(nmax);

    for (int i = 1; i <= n; i++)
        d[i] = 1e9;
    d[start] = 0;

    dijkstra(start, d, in_coada);

    for(int i = 1; i <= n; i++)
        if(b[i] != d[i])
            return false;

    return true;
}

void hb_init()
{
    b.clear();
    for(int i = 1; i <= nmax; i++)
        h[i].clear();
}

int main()
{
    int q, x, y, c;
    fin >> q;
    while(q--)
    {
        fin >> n >> m >> s;

        b.push_back(-1);
        for(int i = 1; i <= n; i++)
        {
            fin >> x;
            b.push_back(x);
        }

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

        if(pb_dijkstra(s)) fout << "DA\n";
        else fout << "NU\n";

        hb_init();
    }

    fin.close();
    fout.close();
    return 0;
}