Cod sursa(job #65423)

Utilizator alextheroTandrau Alexandru alexthero Data 9 iunie 2007 14:41:34
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#include <vector>
#include <queue>

#define inf (int)1e9
#define nmax 50005
#define pb push_back

using namespace std;
typedef pair<int,int> ii;

int n,m,s,T,d[nmax],n1,n2,cst,D[nmax];
ii aux;
vector <ii> e[nmax];

void dijkstra(int s) {
	priority_queue < ii,vector<ii>,greater<ii> > Q;
	for(int i = 1; i <= n; i++) D[i] = inf; D[s] = 0;
	Q.push(ii(0,s));
	while(!Q.empty()) {
		aux = Q.top();	
		if(aux.first == D[aux.second]) {
			if(D[aux.second] != d[aux.second]) return ;
			for(int i = 0; i < (int)e[aux.second].size(); i++)
				if(D[e[aux.second][i].first] > D[aux.second] + e[aux.second][i].second) {
					D[e[aux.second][i].first] = D[aux.second] + e[aux.second][i].second;
					Q.push(ii(D[e[aux.second][i].first],e[aux.second][i].first));
				}
		}
		Q.pop();
	}
}

int solve() {
	scanf("%d%d%d",&n,&m,&s);
	for(int i = 1; i <= n; i++) e[i].clear();
	for(int i = 1; i <= n; i++) scanf("%d",&d[i]);
	for(int i = 1; i <= m; i++) {
		scanf("%d%d%d",&n1,&n2,&cst);
		e[n1].pb(ii(n2,cst));
		e[n2].pb(ii(n1,cst));
	}
	dijkstra(s);
	for(int i = 1; i <= n; i++) if(d[i] != D[i]) return 0;
	return 1;
}


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

	scanf("%d",&T);
	for(int t = 1; t <= T; t++) {
		if(solve()) printf("DA\n");
		else printf("NU\n");
	}

	return 0;
}