Cod sursa(job #419540)

Utilizator s_holmesSherlock Holmes s_holmes Data 17 martie 2010 18:03:23
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#include <vector>
#define NMAX 55001
#define MMAX 105001
#define INF 1000000000
using namespace std;
int T;
int val[NMAX];
int N,M,INC;
struct muchie 
{
	int x, y ,c;
}m[MMAX];
int P[NMAX];

void citire()
{
	scanf("%d %d %d",&N,&M,&INC);
	for(int i = 1 ; i <= N ; i++)
		scanf("%d",&val[i]);
	for(int i = 1 ; i <= M ; i++)
		scanf("%d %d %d",&m[i].x,&m[i].y,&m[i].c);
		
}

bool rezolv()
{
	if(val[INC] != 0)
		return 0;
	for(int i = 1 ; i <= M ; i++)
	{
		if(val[m[i].x] + m[i].c == val[m[i].y])
			P[m[i].y] = 1;

		if(val[m[i].y] + m[i].c == val[m[i].x])
			P[m[i].x] = 1;

		if(val[m[i].x] + m[i].c < val[m[i].y] || val[m[i].y] + m[i].c < val[m[i].x])
			return 0;
	}

	for(int i = 1 ; i <= N ; i++)
		if(!P[i] && i != INC)
			return 0;
	
	return 1;
}

int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	scanf("%d", &T);
	for(int i = 1 ; i <= T ;i++)
	{
		citire();
		if(rezolv())
			printf("DA\n");
		else
			printf("NU\n");
	}
		
	return 0;
}