Cod sursa(job #212356)

Utilizator blasterzMircea Dima blasterz Data 5 octombrie 2008 11:02:07
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
using namespace std;
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#define DIM 8192
#define oo 0x3f3f3f3f
#define N 50001
#define L ((i)<<1)
#define R ((L)+1)
#define T ((i)>>1)

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;
	}
}

vector<vector<pair<int, int> > > a;

int n, m, M,S;
int d[N], d1[N];
int H[N],poz[N];
int nh;

inline void swap(int i, int j)
{
	int t=H[i];H[i]=H[j];H[j]=t;
	poz[H[i]]=i;
	poz[H[j]]=j;
}

inline void upheap(int i)
{
	if(i<=1) return;
	if(d[H[i]] < d[H[T]]) swap(i, T), upheap(T);
}

inline void downheap(int i)
{
	int m=i;
	if(L<=nh)
		if(d[H[m]] > d[H[L]]) m=L;
	if(R<=nh)
		if(d[H[m]] > d[H[R]]) m=R;
	
	
	if(m!=i) swap(m,i), downheap(m);
}


void bell()
{
	int ok=1,i,u;
	memset(d,oo, sizeof(d));
	d[S]=0;

	for(i=1;i<=n;++i) H[i]=i, poz[i]=i;
	for(i=n/2; i; --i) downheap(i);
	nh=n;
	
	while(nh)
	{
		u=H[1];
		swap(1, nh--);
		downheap(1);
		
		for(vector<pair<int,int> > ::iterator it=a[u].begin(); it!=a[u].end(); ++it)
			if(d[u] + it->second < d[it->first])
			{
				d[it->first]=d[u] + it->second;
				upheap(poz[it->first]);
			}
		
		
	}
}

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]);
		a.clear();
		a.resize(n+1);
		
		while(m--)
		{
			cit(p);cit(q);cit(c);
			a[p].push_back(make_pair(q,c));
			a[q].push_back(make_pair(p,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;
}