Cod sursa(job #496525)

Utilizator klamathixMihai Calancea klamathix Data 29 octombrie 2010 15:57:38
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<cstdio>
#include<fstream>
#include<vector>
#include<string>
#define f first
#define s second
const int maxn = 50001;
using namespace std;

int i , j , t , n , m , S , d[maxn] , a , b ,c;
vector <pair < int , int > > G[maxn];

string check()
{
	if ( d[S] != 0 ) return "NU\n";
		
	for( i = 1 ; i <= n ; ++i )
		if ( i != S ) {
		bool ok = 0;
		for( j = 0 ; j < G[i].size() ; ++j )  {
			if ( d[i] + G[i][j].s < d[G[i][j].f] ) return "NU\n";
			if ( (d[G[i][j].f] + G[i][j].s) == d[i]) ok = 1;
		}
		if ( !ok ) return "NU\n";
	}
return "DA\n";
}

int main()
{
	freopen("distante.in","r",stdin);
	ofstream fout("distante.out");
	
	scanf("%d",&t);
		for( ; t-- ; ) {
		scanf("%d %d %d",&n,&m,&S);
		memset(d,0,sizeof(d));
		for ( i = 1 ; i <= n ; ++i ) {
			for( ; !G[i].empty(); ) G[i].pop_back();
			scanf("%d",&d[i]);
		}
		for( i = 1 ; i <= m ; ++i ) {
			scanf("%d %d %d",&a ,&b ,&c);
			G[a].push_back(make_pair ( b , c ));
			G[b].push_back(make_pair ( a , c ));
		}
		
		fout << check();
	}
	
return 0;
}