Cod sursa(job #525291)

Utilizator RegeleUmbrelorPopescu Mihai RegeleUmbrelor Data 24 ianuarie 2011 19:24:44
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
using namespace std;
#include<stdio.h>
#include<vector>
const int NMAX=50002;
int n, m, t, s, c[NMAX];
vector <int> a[NMAX],b[NMAX];

void resetare()
{
	for(int i=1;i<=n;++i)
	{
		a[i].clear();
		b[i].clear();
	}
}

void citire()
{
	int i,x,y,z;
	scanf("%d%d%d",&n,&m,&s);
	for(i=1;i<=n;++i)
		scanf("%d",&c[i]);
	resetare();
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%d", &x,&y,&z);
		a[x].push_back(y);
		a[y].push_back(x);
		b[x].push_back(z);
		b[y].push_back(z);
	}
}

void rez()
{
	int i,j,y,z,v;
	if(c[s]!=0)
	{	
		printf("NU\n");
		return;
	}	
	for(i=1;i<=n;++i)
		if(i!=s)
		{
			v=0;
			for(j=0;j<a[i].size();++j)
			{
				y=a[i][j];
				z=b[i][j];
				if(c[y]+z<c[i])
				{	
					printf("NU\n");
					return;
				}
				if(c[y]+z==c[i])
					v=1;
			}
			if(!v)
			{	
				printf("NU\n");
				return;
			}
		}
	printf("DA\n");
}

int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%d",&t);
	for(int i=1;i<=t;++i)
	{
		citire();
		rez();
	}
}