Cod sursa(job #590205)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 15 mai 2011 21:45:05
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
#include<vector>
#define Nmax 50010
#define Inf 1<<30
using namespace std;

int T,i,ok,n,m,best[Nmax],a,b,c,nod,fiu,cost,S,N;

vector< pair<int,int> > G[Nmax];

int main()
{
	freopen("distante.in","r",stdin);
	freopen("distante.out","w",stdout);
	
	scanf("%d",&T);
	
	for( ; T ; --T )
	{
		scanf("%d %d %d",&n,&m,&S);
		
		for( i = 1 ; i <= n ; i++ ) 
			scanf("%d",&best[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));
		}	
		
		ok = 1 ;
		for( nod = 1 ; nod <= n ; nod++ )	
		{
			if( nod == S )
				if( best[nod] ) { ok = 0 ;  break ; }
					else continue ;
			
			N = G[nod].size(); cost = Inf ; 
			
			for( i = 0 ; i < N ; i++ )
			{
				fiu = G[nod][i].first;
				
				if( G[nod][i].second + best[fiu] < cost )
					cost = G[nod][i].second + best[fiu] ; 
			}
			
			if( cost != best[nod] ) { ok = 0 ;  break ; }
		}
		
		for( i = 1 ; i <= n ; i++ )
			G[i].clear();
		
		if( ok ) printf("DA\n");
		else	 printf("NU\n");
	}
	
	return 0;
}