Cod sursa(job #593298)

Utilizator darrenRares Buhai darren Data 2 iunie 2011 09:59:33
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

typedef vector<pair<int, int> > VP;
const int INF = 0x3f3f3f3f;

int T, N, M, X;
int D[50002], Dnow[50002], pos[50002];
VP V[50002];

bool compare(const int& i1, const int& i2)
{
    return D[i1] < D[i2];
}

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

    fin >> T;
    while (T--)
    {
        fin >> N >> M >> X;
        for (int i = 1; i <= N; ++i)
        {
            fin >> D[i];
            pos[i] = i;
            Dnow[i] = INF;
        }
        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));
        }

        sort(pos + 1, pos + N + 1, compare);

        bool ok = true;

        Dnow[X] = 0;
        for (int i = 1; i <= N; ++i)
        {
            if (Dnow[pos[i]] != D[pos[i]]) ok = false;
            if (!ok) break;

            for (VP::iterator it = V[pos[i]].begin(); it != V[pos[i]].end(); ++it)
                if (Dnow[it->first] > Dnow[pos[i]] + it->second)
                    Dnow[it->first] = Dnow[pos[i]] + it->second;
        }

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

        for (int i = 1; i <= N; ++i)
            V[i].clear();
    }

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