Cod sursa(job #2089845)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 17 decembrie 2017 11:42:41
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>
#define in "distante.in"
#define out "distante.out"
#define MN 50005
using namespace std;
struct nod
{
    int vrf, cst;
    nod* next;
};
typedef nod* graf;
graf A[MN];
int Sol[MN], T, N, M, S;

void add(int srs, int vrf, int cst)
{
    graf p = new nod;
    p->vrf = vrf;
    p->cst = cst;
    p->next = A[srs];
    A[srs] = p;
}

bool checkNode(int srs)
{
    bool ok = srs==S;
    graf q = A[srs];
    while(q)
    {
        if(Sol[srs] + q->cst < Sol[q->vrf]) return 0;
        if(Sol[q->vrf] + q->cst == Sol[srs]) ok = 1;
        q = q->next;
    }
    return ok;
}

bool checkValidSol()
{
    if(Sol[S]!=0) return 0;
    for(int i = 1; i <= N; ++i)
        if(!checkNode(i)) return 0;
    return 1;
}

int main()
{
    assert(freopen(in, "r", stdin));
    assert(freopen(out,"w", stdout));
    assert(scanf("%d", &T));
    while(T--)
    {
        assert(scanf("%d%d%d", &N, &M, &S));
        for(int i = 1; i <= N; ++i)
            assert(scanf("%d", Sol+i));
        memset(A, 0, sizeof(A));
        for(int a, b, c; M; --M)
        {
            assert(scanf("%d%d%d", &a, &b, &c));
            if(a!=b)
                add(a, b, c), add(b, a, c);
        }
        assert(printf("%s\n", (checkValidSol()? "DA":"NU")));
    }
    fclose(stdin), fclose(stdout);
    return 0;
}