Cod sursa(job #633463)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 13 noiembrie 2011 20:20:03
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <cstring>

#define file_in "distante.in"
#define file_out "distante.out"

#define nmax 150100

int T,N,M,nod;
int d[nmax];
int d1[nmax];
int x[nmax];
int y[nmax];
int c[nmax];
int i;

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d", &T);
	while(T--){
		
		scanf("%d %d %d", &N, &M, &nod);
		for (i=1;i<=N;++i)
			 scanf("%d", &d1[i]),
			 d[i]=0;
		for (i=1;i<=M;++i){
			scanf("%d %d %d", &x[i], &y[i], &c[i]);
			if (x[i]==nod)
				d[y[i]]=c[i];
			if (y[i]==nod)
				d[x[i]]=c[i];
		}
		
		for (i=1;i<=N;++i)
			 if (i!=nod)
				  if (d[i]==0)
					  d[i]=0x3f3f3f3f;
		int ok=0;
		
		while(!ok){
			ok=1;
			for (i=1;i<=M;++i){
				if (d[x[i]]>d[y[i]]+c[i]){
					d[x[i]]=d[y[i]]+c[i];
					ok=0;
				}
				if (d[y[i]]>d[x[i]]+c[i]){
					d[y[i]]=d[x[i]]+c[i];
					ok=0;
				}
			}
		}
		
		for (i=1;i<=N;++i)
			 if (i!=nod)
				  if (d[i]==0x3f3f3f3f)
					  d[i]=0;
		
		ok=1;
		for (i=1;i<=N && ok;++i)
			 if (d1[i]!=d[i])
				 ok=0;
			 
		if (ok)
            printf("DA\n");
		else
			printf("NU\n");
	}
	
	return 0;
	
}