Cod sursa(job #2103637)

Utilizator calin1Serban Calin calin1 Data 10 ianuarie 2018 16:21:35
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <cstdio>
#define N 50005
#define inf 0x3f3f3f3f

using namespace std;

int n, m, s;

int d[N], viz[N];

void clean()
{
    for(int i = 0 ; i <= n ; ++i)
    {
        d[i] = inf;

        viz[i] = 0;
    }
}

int verify()
{
    for(int i = 1 ; i <= n ; ++i)
    {
        if(!viz[i])
        {
            return 0;
        }
    }

    return 1;
}

int r_graph()
{
    int x, y, c;

    scanf("%d %d %d\n", &n, &m, &s);

    clean();

    viz[s] = 1;

    for(int j = 1 ; j <= n ; ++j)
    {
        scanf("%d ", &d[j]);
    }

    if(d[s])
    {
        return 0;
    }

    for(int j = 0 ; j < m ; ++j)
    {
        scanf("%d %d %d\n", &x, &y, &c);

        if(d[x] > d[y] + c || d[y] > d[x] + c)
        {
            return 0;
        }

        if(d[x] == d[y] + c)
        {
            viz[x]++;
        }

        if(d[y] == d[x] + c)
        {
            viz[y]++;
        }
    }

    return verify();
}

void citire()
{
    int nr;

    scanf("%d\n", &nr);

    for(int i = 0 ; i < nr ; ++i)
    {
        if(r_graph())
        {
            printf("DA\n");
        }
        else
        {
            printf("NU\n");
        }
    }
}

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

    citire();

    return 0;
}