Cod sursa(job #153710)

Utilizator MarquiseMarquise Marquise Data 10 martie 2008 18:13:35
Problema Distante Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>

#define NMAX 50001


struct nod
{
	int v, cost;
	nod *next;
};

int N, M, S, d[NMAX], T, r[NMAX];
nod *m[NMAX];

void adaug(int a, int b, int c)
{
	nod *aux;
	aux = new nod;
	aux -> v = b;
	aux -> cost = c;
	aux -> next = m[a];
	m[a] = aux;
}


int rezolv()
{
	nod *p;
	int ex = 1, i;

	for ( i = 1; i <= N && ex; i++)
	{
		for ( p = m[i]; p; p = p -> next)
			if ( p -> v != S && d[i] + p -> cost < d[ p -> v])
				ex = 0;
			else
				if ( d[i] + p -> cost == d[ p-> v] )
					r[ p->v] = 1;
	}
	if (ex)
		for ( i = 1; i <= N; i++)
		if ( !r[i] && i != S)
			ex = 0;
	return ex;
}


int main()
{
	int i, t, a, b, c;
	freopen("distante.in", "r", stdin);
	freopen("distante.out", "w", stdout);
	scanf("%d", &T);
	for ( t = 1; t <= T; t++)
	{
		scanf("%d %d %d", &N, &M, &S);
		for ( i = 1; i <= N; i++)
			scanf("%d", &d[i]);
		for ( i = 1; i <= M; i++)
		{
			scanf("%d %d %d", &a, &b, &c);
			adaug(a, b, c);
			adaug(b, a, c);
		}
		if ( rezolv() )
			printf("DA\n");
		else
			printf("NU\n");

		for ( i = 1; i <= N; i++)
		{
			delete []m[i];
			m[i] = NULL;
		}

	}
	return 0;
}