Cod sursa(job #518852)

Utilizator blasterzMircea Dima blasterz Data 3 ianuarie 2011 12:47:55
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>
#include <cstring>
#define N 50001

int a[N];
int d[N];
int T;
int n, m, S;

void solve ()
{
	int p, q, c;
	for (int i = 1; i <= n; ++i)
		scanf ("%d ", &d[i]);
	memset (a, 0, sizeof (a));
	
	for (int i = 1; i <= n; ++i)
		if (d[i] == -1)
			a[i] = -1;
	bool ok = 1;
	
	if (d[S] != 0)
		ok = 0;
	
	for (int i = 1; i <= m; ++i)
	{
		scanf ("%d %d %d\n", &p, &q, &c);
		
		if (d[p] + c >= d[q] || d[q] + c >= d[p])
			;
		else
			ok = 0;
		
		if (d[p] + c == d[q])
			a[q] = 1;
		if (d[q] + c == d[p])
			a[p] = 1;
	}
	
	for (int i = 1;i <= n; ++i)
		if (a[i] == 0 && i != S)
		{
			ok = 0;
			break;
		}

	printf ("%s\n", ok ? "DA" : "NU");
}

int main ()
{
	freopen ("distante.in", "r",stdin);
	freopen ("distante.out", "w", stdout);
	
	scanf ("%d\n", &T);
	
	while (T--)
	{
		scanf ("%d %d %d\n", &n, &m, &S);
		solve ();
	}
	
	
	
	return 0;
}