Cod sursa(job #1394427)

Utilizator Ionut228Ionut Calofir Ionut228 Data 20 martie 2015 12:14:50
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>

using namespace std;

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

int T, N, M, S;
int Dinit[50005], Dmin[50005];
vector<pair<int, int> > V[50005];
bool ok;

struct muchie
{
    int nod, d;

    bool operator < (const muchie& m) const
    {
        if (m.d < d)
            return true;
        return false;
    }
};
priority_queue<muchie> Q;

void add(int nod)
{
    muchie m;
    for (vector<pair<int, int> >::iterator it = V[nod].begin(); it != V[nod].end(); ++it)
    {
        if (!Dmin[it->first])
        {
            m.nod = it->first;
            m.d = Dmin[nod] + it->second;
            Q.push(m);
        }
    }
}

void djk(int nod)
{
    memset(Dmin, 0, sizeof(Dmin));
    Dmin[nod] = 0;
    add(nod);

    muchie m;
    while (!Q.empty())
    {
        m = Q.top();
        Q.pop();

        if (Dmin[m.nod])
            continue;

        Dmin[m.nod] = m.d;
        if (Dmin[m.nod] < Dinit[m.nod])
        {
            ok = false;
            break;
        }
        add(m.nod);
    }

    while (!Q.empty())
        Q.pop();
}

int main()
{
    fin >> T;
    while (T--)
    {
        for (int i = 1; i <= N; ++i)
            V[i].clear();

        fin >> N >> M >> S;
        for (int i = 1; i <= N; ++i)
            fin >> Dinit[i];
        for (int i = 1, nod1, nod2, cost; i <= M; ++i)
        {
            fin >> nod1 >> nod2 >> cost;
            V[nod1].push_back(make_pair(nod2, cost));
            V[nod2].push_back(make_pair(nod1, cost));
        }

        ok = true;
        djk(S);

        if (ok)
            fout << "DA\n";
        else
            fout << "NU\n";
    }

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