Cod sursa(job #1089976)

Utilizator pulseOvidiu Giorgi pulse Data 22 ianuarie 2014 09:35:04
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>

using namespace std;

#define NMAX 50003
#define INF 0x3f3f3f3f

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

void ReadData ()
{
    scanf ("%d %d %d", &N, &M, &start);
    for (int i = 1; i <= N; ++i)
        scanf ("%d", &dZ[i]);
    for (int i = 1, a, b, c; i <= M; ++i)
    {
        scanf ("%d %d %d", &a, &b, &c);
        v[a].push_back (b);
        v[a].push_back (c);
    }
    for (int i = 1; i <= N; ++i)
        cost[i] = INF;
    cost[start] = 0;
}

void Solve ()
{
    q.push (start);
    while (!q.empty ())
    {
        int x = q.front ();
        q.pop ();
        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];
            }
        }
    }
}

int Check ()
{
    for (int i = 1; i <= N; ++i)
    {
        if (cost[i] != dZ[i])
            return 0;
    }
    return 1;
}

int main ()
{
    freopen ("distante.in", "r", stdin);
    freopen ("distante.out", "w", stdout);
    scanf ("%d", &T);
    for (int i = 1; i <= T; ++i)
    {
        ReadData ();
        Solve ();
        int ok = Check ();
        if (ok)
            printf ("DA\n");
        else
            printf ("NU\n");
        memset (v, 0, sizeof (v));
        memset (dZ, 0, sizeof (dZ));
    }
    return 0;
}