Cod sursa(job #1090083)

Utilizator pulseOvidiu Giorgi pulse Data 22 ianuarie 2014 12:34:03
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
#define NMAX 50002

using namespace std;

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

int T, N, M, cost[NMAX], start, dZ[NMAX];
vector <int> v[NMAX];
queue <int> q;
bool ok = true;

void ReadData ()
{
    fin >> N >> M >> start;
    for (int i = 1; i <= N; ++i)
        fin >> dZ[i];
    for (int i = 1, a, b, c; i <= M; ++i)
    {
        fin >> a >> b >> c;
        v[a].push_back (b);
        v[a].push_back (c);
        v[b].push_back (a);
        v[b].push_back (c);
    }
    for (int i = 1; i <= N; ++i)
    {
        if (i != start)
            cost[i] = INF;
    }
}

void Solve ()
{
    q.push (start);
    while (!q.empty ())
    {
        int x = q.front ();
        for (int i = 0; i < v[x].size (); i += 2)
        {
            if (cost[v[x][i]] > cost[x] + v[x][i + 1])
            {
                q.push (v[x][i]);
                cost[v[x][i]] = cost[x] + v[x][i + 1];
                //fout << cost[v[x][i]] << " ";
                if (cost[v[x][i]] != dZ[v[x][i]])
                {
                    ok = false;
                    return;
                }
            }
        }
        q.pop ();
    }
}

int main ()
{
    fin >> T;
    for (int i = 1; i <= T; ++i)
    {
        ReadData ();
        ok = true;
        Solve ();
        if (ok)
            fout << "DA\n";
        else
            fout << "NU\n";
        memset (cost, 0, sizeof(cost));
        memset (v, 0, sizeof(v));
    }
    fin.close (); fout.close ();
    return 0;
}