Cod sursa(job #344526)

Utilizator rumburakrumburak rumburak Data 30 august 2009 14:32:53
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include<cstdio>

const int N = (1<<16);
const int M = (1<<17);

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

int n,m,s,d[N];
muchie v[M];

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

bool verifica()
{
	int i,x,y,c;
	bool b[N]={false};
	for(i=1 ; i<=m ; ++i)
	{
		x=v[i].x; y=v[i].y; c=v[i].c;
		if(d[x]+c<d[y])
			return false;
		if(d[y]+c<d[x])
			return false;
		if(d[x]+c==d[y])
			b[y]=true;
		if(d[y]+c==d[x])
			b[x]=true;
	}
	for(i=1 ; i<=n ; ++i)
		if(i!=s && !b[i])
			return false;
	return true;
}

int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	int t;
	bool ok;
	scanf("%d",&t);
	while(t--)
	{
		citire();
		ok=verifica();
		if(ok)
			printf("DA\n");
		else
			printf("NU\n");
	}
	return 0;
}