Cod sursa(job #1750846)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 31 august 2016 12:10:49
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <iostream>
#include <cstdio>
#define MAXN 50050
#define DIM 300000

using namespace std;

int t, n, m, s, cursor;
int d[MAXN], ok[MAXN];
char buf[DIM];

char getChar()
{
    if (cursor == DIM) {
        fread(buf, 1, DIM, stdin);
        cursor = 0;
    }
    return buf[cursor];
}

int getInt()
{
    for (char c = getChar(); c < '0' || c > '9'; c = getChar())
		cursor++;
    int nr = 0;
    for (char c = getChar(); c >= '0' && c <= '9'; c = getChar()) {
		nr = nr*10 + c - '0';
        cursor++;
    }
    return nr;
}

void citire()
{
	n = getInt(); m = getInt(); s = getInt();
    for (int i = 1; i <= n; i++)
        d[i] = getInt();
}

bool solve()
{
    if (d[s] != 0) return 0;
    for (int i = 1; i <= n; i++) ok[i] = 0;
    ok[s] = 1;
	for (int i = 1; i <= m; i++) {
		int x = getInt();
		int y = getInt();
		int c = getInt();
        if (d[x] + c == d[y])
			ok[y] = 1;
        if (d[y] + c == d[x])
            ok[x] = 1;
        if (d[x] + c < d[y] || d[y] + c < d[x])
            return 0;
    }
    for (int i = 1; i <= n; i++)
		if (!ok[i]) return 0;
	return 1;
}

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

    t = getInt();
    while (t--) {
        citire();
        int rez = solve();
		if (rez == 1)
			printf("DA\n");
		else
			printf("NU\n");
    }

    return 0;
}