Cod sursa(job #451563)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 9 mai 2010 18:29:57
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

int *d, *gasit;

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

	int t;
	scanf("%d", &t);

	int n, m, s, i, x, y, c, rez;
	while(t--)
	{
		scanf("%d%d%d", &n, &m, &s);
		d = (int*)calloc(n + 1, sizeof(int));
		gasit = (int*)calloc(n + 1, sizeof(int));
		gasit[s] = 1;
		rez = 1;
		for(i = 1; i <= n; ++i) 
		{
			scanf("%d", &d[i]);
			assert(d[i] >= 0);
		}
		gasit[s] = 1;
		if(d[s] != 0) rez = 0;
		for(i = 1; i <= m; ++i)
		{
			scanf("%d%d%d", &x, &y, &c);

			// incerc sa fac o relaxare folosind aceasta muchie
			if(d[y] > d[x] + c) rez = 0;
			if(d[x] > d[y] + c) rez = 0;
				
			if(!gasit[y]) if(d[y] == d[x] + c) gasit[y] = 1;
			if(!gasit[x]) if(d[x] == d[y] + c) gasit[x] = 1;
		}

		for(i = 1; i <= n && rez == 1; ++i) if(!gasit[i]) rez = 0;

		if(rez) printf("DA\n");
		else printf("NU\n");

		free(d);
		free(gasit);
	}

	return 0;
}