Cod sursa(job #773477)

Utilizator badmanDragan Dan badman Data 1 august 2012 19:50:06
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <vector>
#include <limits.h>
#define inf INT_MAX

using namespace std;

int q[100001], d[50001], a[50001];
vector<int> g1[50001], g2[50001];
int n, m, i, j, T, start, c, x, y;
int st, dr, p;
int main() {
	freopen("distante.in", "r", stdin);
	freopen("distante.out", "w", stdout);
	scanf("%d", &T);
	while(T) {
		scanf("%d %d %d", &n, &m, &start);
		for(i = 1; i <= n; i++) {
			scanf("%d", &a[i]);
			d[i] = inf;
			g1[i].clear();
			g2[i].clear();
			g1[i].push_back(0);
			g2[i].push_back(0);
		}
		for(i = 1; i <= m; i++) {
			scanf("%d %d %d", &x, &y, &c);
			g1[x].push_back(y);
			g1[y].push_back(x);
			g2[x].push_back(c);
			g2[y].push_back(c);
			
		}
		d[start] = 0;
		q[1] = start;
		st = dr = 1;
		while(st <= dr) {
			p = q[st++];
			for(i = 1; i < g1[p].size(); i++)
				if(d[g1[p][i]] > d[p] + g2[p][i]) {
					d[g1[p][i]] = d[p] + g2[p][i];
					q[++dr] = g1[p][i];
				}
		}
	
		int sem = 1;
		i = 0;
		while(sem && i < n) {
			++i;
			if(a[i] != d[i])
				sem = 0;
		}
		if(sem)
			printf("DA\n");
		else
			printf("NU\n");
		T--;
 	}
	return 0;
}