Cod sursa(job #781628)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 24 august 2012 19:18:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cassert>
#include <cstdio>

#include <algorithm>
#include <vector>
using namespace std;

#define FORIT(it, v) for (typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)

const int N = 50005;

int t, n, m, s;
int dist[N];
vector <pair <int, int> > vec[N];

int verifica()
{
    if (dist[s] != 0)
        return 0;

    for (int i = 1; i <= n; ++i) {
        if (i == s)
            continue;

        bool ok = false;
        FORIT(it, vec[i]) {
            if (dist[i] + it->second < dist[it->first])
                return 0;

            if (dist[it->first] + it->second == dist[i])
                ok = true;
        }
        if (!ok)
            return 0;
    }

    return 1;
}

void init()
{
    for (int i = 1; i <= n; ++i)
        vec[i].clear();
}

int main()
{
    assert(freopen("distante.in", "r", stdin) != NULL);
    assert(freopen("distante.out", "w", stdout) != NULL);

    assert(scanf("%d", &t) == 1);

    while (t--) {
        init();
        assert(scanf("%d %d %d", &n, &m, &s) == 3);
        for (int i = 1; i <= n; ++i)
            assert(scanf("%d", &dist[i]) == 1);
        for (int i = 1; i <= n; ++i) {
            int x, y, z;
            assert(scanf("%d %d %d", &x, &y, &z) == 3);
            vec[x].push_back(make_pair(y, z));
            vec[y].push_back(make_pair(x, z));
        }

        if (verifica())
            printf("DA\n");
        else
            printf("NU\n");
    }
}