Cod sursa(job #2103044)

Utilizator B_RazvanBaboiu Razvan B_Razvan Data 9 ianuarie 2018 18:44:34
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <cstdio>
#define NMAX 50005

using namespace std;

int N, M, S, D[NMAX], viz[NMAX];

struct vect{
    int a, b, c;
}v[NMAX];

bool verificareViz()
{
    for(int i=1; i<=M; ++i)
    {
        if(D[v[i].a] + v[i].c < D[v[i].b])
            return false;
        if(D[v[i].b] + v[i].c < D[v[i].a])
            return false;
        if(D[v[i].a] + v[i].c == D[v[i].b])
            viz[v[i].b] = 1;
        if(D[v[i].b] + v[i].c == D[v[i].a])
            viz[v[i].a] = 1;
    }

    for(int i=1; i<=N; ++i)
        if(!viz[i])
            return false;
    return true;
}

bool read()
{
    scanf("%d%d%d", &N, &M, &S);
    for(int i=1; i<=N; ++i)
    {
        scanf("%d", &D[i]);
        viz[i] = 0;
    }

    if(D[S] != 0)
        return false;
    viz[S] = 1;

    for(int i=1; i<=M; ++i)
        scanf("%d%d%d", &v[i].a, &v[i].b, &v[i].c);

    return verificareViz();
}

int main()
{
    freopen("distante.in", "r", stdin);
    freopen("distante.out", "w", stdout);
    int T;
    scanf("%d", &T);
    for(int i=1; i<=T; ++i)
    {
        if(read() == true)
            printf("DA\n");
        else
            printf("NU\n");
    }
    return 0;
}