Cod sursa(job #147681)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 3 martie 2008 13:00:02
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <stdio.h>
#include <vector>

using namespace std;

const int N_MAX = 50010;

vector <pair <int, int> > G[N_MAX];
int dist[N_MAX];

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

	int T, N, M, S, x, y, g, nod, c;
	for (scanf("%d\n", &T); T; T --) {
		
		scanf("%d %d %d\n", &N, &M, &S);
		for (int i = 1; i <= N; i ++) {
			scanf("%d ", &dist[i]);
			G[i].clear();
		}

		for (int i = 1; i <= M; i ++) {
			scanf("%d %d %d\n", &x, &y, &c);
			G[x].push_back(make_pair(y, c));
			G[y].push_back(make_pair(x, c));
		}

		vector <pair <int, int> >::iterator it;
		g = 1;
		int da = 1;
		for (int i = 1; i <= N; i ++) {
			if (i != S) {

				nod = 0;
				for (it = G[i].begin(); it != G[i].end(); ++ it) {
					if (dist[it -> first] + (it -> second) < dist[i]) {
						g = 0;
						break;
					}
					if (dist[it -> first] + (it -> second) == dist[i]) nod ++;
				}

//				printf("nod = %d g = %d cati = %d\n", i, g, nod);

				if (!g || !nod) {
					printf("NU\n");
					da = 0;
					break;
				}
			}
		}

		if (da) printf("DA\n");
	}	

	return 0;
}