Cod sursa(job #212337)

Utilizator blasterzMircea Dima blasterz Data 5 octombrie 2008 10:08:07
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <cstdio>
#include <string>
#define DIM 8192
#define oo 0x3f3f3f3f

char ax[DIM];
int pz;
inline void cit(int &x)
{
	x=0;
	while(ax[pz]<'0' || ax[pz]>'9')
		if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
	while(ax[pz]>='0' && ax[pz]<='9')
	{
		x=x*10+ax[pz]-'0';
		if(++pz==DIM)fread(ax,1,DIM,stdin),pz=0;
	}
}

struct nod{ int x, y, c;};

nod a[200001];
int n, m, M,S;
int d[50001], d1[50001];

void bell()
{
	int ok=1,i;
	memset(d,oo, sizeof(d));
	d[S]=0;
	int p, q, c;
	
	while(ok)
	{
		ok=0;
		for(i=1;i<=M;++i)
		{
			p=a[i].x, q=a[i].y, c=a[i].c;
			
			if(d[p] + c < d[q]) d[q]=d[p]+c, ok=1;
		}
	}
	
}

int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	int T,p,q,c,i;
	cit(T);
	while(T--)
	{
		cit(n);cit(m);cit(S);
		M=0;
		for(i=1;i<=n;++i) cit(d1[i]);
		
		while(m--)
		{
			cit(p);cit(q);cit(c);
			a[++M].x=p;
			a[M].y=q;
			a[M].c=c;
			a[++M].x=q;
			a[M].y=p;
			a[M].c=c;
		}
		bell();
		
		int ok=1;
		for(i=1;i<=n;++i) if(d1[i]!=d[i]){ ok=0;break;}
		if(ok) printf("DA\n");
		else printf("NU\n");
	}
	return 0;
}