Cod sursa(job #704892)

Utilizator tangredonSilviu Georgescu tangredon Data 2 martie 2012 21:43:55
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
#define mp make_pair
#define pb push_back
#define OO 99999999
//================================================================================
ifstream f ( "distante.in" );
ofstream g ( "distante.out");

//================================================================================

vector < int > G[50100];
vector < int > C[50100];
set < pair < int , int > > T;

int n,m,Z,s,d[50100],sol[50100];

//================================================================================
void Read();
void Distanta( int );

//================================================================================

int main()
{
	f >> Z;
	
	for ( int i = 1; i <= Z ; i++ )
	{
		Read ();
		Distanta( s );
	}
}

void Read ()
{
	int x,y,d;
	
	f >> n >> m >> s;
	
	for ( int i = 1; i <= n ; i++ )
		f >> sol[i];
	
	for ( int i = 1; i <= m ; i++ )
	{
		f >> x >> y >> d;
		G[x].pb(y);
		C[x].pb(d);
	}
}

void Distanta ( int x )
{
	for ( int i = 1 ; i <= n ; i++ )
		d[i] = OO;
	
	d[x] = 0;
	T.insert( mp ( 0, x ) );
	
	int nod, c;
	
	while ( T.size() > 0 )
	{
		c = (*T.begin()).first;
		nod = (*T.begin()).second;
		T.erase(*T.begin());
		
		for ( unsigned int i = 0 ; i < G[nod].size()  ; i++ )
		{
			if ( d[ G[nod][i] ] > c + C[nod][i] )
			{
				d[ G[nod][i] ] = c + C[nod][i];
				T.insert ( mp ( d[ G[nod][i] ], G[nod][i] ) );
			}
			
		}
	}
	
	for ( int i = 1 ; i <= n ; i++ )
	{
		G[i].clear();
		C[i].clear();
	}
	T.clear();
	
	for ( int i = 1 ; i <= n ; i++ )
		if ( d[i] != sol[i] )
		{
			g << "NU" << '\n';
			return;
		}			
	g << "DA" << '\n';
}