Cod sursa(job #2129731)

Utilizator papinub2Papa Valentin papinub2 Data 13 februarie 2018 01:15:55
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <vector>
#include <queue>
#define mp make_pair
#define inf 50000005

using namespace std;

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

const int Nmax = 50005;

vector<int> d(Nmax);

struct compara
{
    bool operator()(int x, int y)
    {
        return d[x] > d[y];
    }
};

vector<pair<int, int> > A[Nmax];
priority_queue<int, vector<int>, compara> Q;

void Dijkstra (int start, int&n, vector<bool>&verif)
{
    for (int i = 1; i <= n; i++)
        d[i] = inf;

    d[start] = 0;
    Q.push(start);

    while (!Q.empty())
    {
        int nod = Q.top();
        Q.pop();
        verif[nod] = 0;

        for (auto i = 0; i < A[nod].size(); i++)
        {
            int nod_cur = A[nod][i].first;
            int val_cur = A[nod][i].second;
            int lungime = d[nod] + val_cur;

            if (lungime < d[nod_cur])
            {
                d[nod_cur] = lungime;

                if (verif[nod_cur] == 0)
                {
                    verif[nod_cur] = 1;
                    Q.push(nod_cur);
                }
            }
        }
    }
}

void Clear(int&n)
{
    for (int i = 1; i <= n; i++)
        A[i].clear();
}

int main()
{
    int t;
    vector<int> rez(Nmax);
    vector<bool> verif(Nmax);

    in >> t;

    while (t)
    {
        int n, m, s;
        bool OK = true;
        in >> n >> m >> s;

        for (int i = 1; i <= n; i++)
            in >> rez[i];

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

            A[x].push_back(mp(y, c));
            A[y].push_back(mp(x, c));
        }

        Dijkstra(s, n, verif);

        for (int i = 1; i <= n; i++)
            if (d[i] != rez[i])
            {
                OK = false;
                break;
            }

        if (OK == true)
            out << "DA" << '\n';
        else
            out << "NU" << '\n';

        Clear(n);
        t--;
    }

    return 0;
}