Cod sursa(job #707969)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 6 martie 2012 10:02:02
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<cstdio>
#include<vector>
#include <utility>
#include <queue>
#define maxn 50001
using namespace std;

vector < pair<long, long> > A[maxn];
queue <long> q;
long T, N, M, C[maxn], D[maxn];
long i, j, x, y, d, Start;
bool ok;
void golire() {
	for (i = 1; i <= N; ++i)
		A[i].clear();
}

void dijkstra(long Start) {
	long i, elc, G[maxn];
	for (i = 1; i <= N; ++i) {
		G[i] = A[i].size();
	}
	for (i = 1; i <= N; ++i)
		C[i] = 250000002;
	C[Start] = 0;
	q.push(Start);
	
	for (; !q.empty(); q.pop()) {
		elc = q.front();
		
		for (i = 0; i < G[elc]; ++i) {
			if ( C[elc] + A[elc][i].second < C[A[elc][i].first] ) {
				C[ A[elc][i].first ] = C[elc] + A[elc][i].second;
				q.push(A[elc][i].first);
			}
		}
	}
}

int main() {
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
		
		for (scanf("%ld", &T); T; --T) {
			golire();
			scanf("%ld %ld %ld", &N, &M, &Start);
			
			for (i = 1; i <= N; ++i)
				scanf("%ld", &D[i]);
			
			for (i = 1; i <= M; ++i) {
				scanf("%ld %ld %ld", &x, &y, &d);
				A[x].push_back( make_pair(y, d) );
				A[y].push_back( make_pair(x, d) );
			}
			
			dijkstra(Start);
			
			ok = true;
			for (i = 1; i <= N; ++i) {
				if (C[i] == 250000002 && D[i] != 0) {
					ok = false;
					break;
				} else if (C[i] != D[i]) {
					ok = false;
					break;
				}
			}
			
			if (ok == true) {
				printf("DA\n");
			} else {
				printf("NU\n");
			}
		}
	
	return 0;
}