Cod sursa(job #1075830)

Utilizator drobertDumitru Robert drobert Data 9 ianuarie 2014 16:59:00
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin( "distante.in" );
ofstream cout( "distante.out" );

int d[ 50001 ], dProb[ 50001 ], q[ 50001 ];
int x, y, cost, n, m, t, dMin, vMin, s, teste; 
vector<int> v[ 50001 ], c[ 50001 ];

int main()
{
	int i, j, ok;
	cin >> teste;
	for ( t = 1; t <= teste; t++ )
	{
		cin >> n >> m >> s;
		for ( i = 1; i <= n; i++ )
		{
			cin >> dProb[ i ];
			d[ i ] = 9999999;
		}
		for ( i = 1; i <= m; i++ )
		{
			cin >> x >> y >> cost;
			if ( x == s )
				d[ y ] = cost;
			v[ x ].push_back( y );
			v[ y ].push_back( x );
			c[ x ].push_back( cost );
			c[ y ].push_back( cost );
		}
		q[ s ]++;
		d[ s ] = 0;
		for ( j = 1; j <= n; j++ )
		{
			dMin = 9999999;
			for ( i = 1; i <= n; i++ )
				if ( dMin > d[ i ] && q[ i ] < t )
				{
					dMin = d[ i ];
					vMin = i;
				}
			q[ vMin ]++;
			for ( i = 0; i < v[ vMin ].size(); i++ )
				if ( q[ v[ vMin ][ i ] ] < t && d[ v[ vMin ][ i ] ] > d[ vMin ] + c[ vMin ][ i ] )
					d[ v[ vMin ][ i ] ] = d[ vMin ] + c[ vMin ][ i ];
		}
		ok = 1;
		for ( i = 1; i <= n; i++ )
			if ( d[ i ] != dProb[ i ] )
			{
				cout << "NU" << '\n';
				ok = 0;
				break;
			}
		if ( ok ) cout << "DA" << '\n';
	}
}