Cod sursa(job #1075484)

Utilizator drobertDumitru Robert drobert Data 8 ianuarie 2014 23:48:42
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <fstream>
using namespace std;
ifstream cin( "distante.in" );
ofstream cout( "distante.out" );

int n, m, t, s, distProb[ 50001 ], d[ 500001 ];
struct edge { int x, y, cost; }a[ 100001 ];

int main()
{
	int i, j, ok;
	cin >> t;
	for ( ; t; t-- )
	{
		cin >> n >> m >> s;
		for ( i = 1; i <= n; i++ )
			d[ i ] = 999999;
		for ( i = 1; i <= n; i++ )
			cin >> distProb[ i ];
		for ( i = 1; i <= m; i++ )
		{
			cin >> a[ i ].x >> a[ i ].y >> a[ i ].cost;
			if ( a[ i ].x == s ) d[ a[ i ].y ] = a[ i ].cost;
			else if ( a[ i ].y == s ) d[ a[ i ].x ] = a[ i ].cost;
		}
		d[ s ] = 0;
		ok = 1;
		while ( ok )
		{
			ok = 0;
			for ( i = 1; i <= m; i++ )
			{
				if ( d[ a[ i ].y ] > d[ a[ i ].x ] + a[ i ].cost )
				{
					d[ a[ i ].y ] = d[ a[ i ].x ] + a[ i ].cost;
					ok = 1;
				}
				else if ( d[ a[ i ].x ] > d[ a[ i ].y ] + a[ i ].cost )
				{
					d[ a[ i ].x ] = d[ a[ i ].y ] + a[ i ].cost;
					ok = 1;
				}
			}
		}
		//for ( i = 1; i <= n; i++ )
		//	cout << d[ i ] << " ";
		//cout << '\n';
		for ( i = 1; i <= n; i++ )
			if ( d[ i ] != distProb[ i ] )
			{
				ok = 1;
				break;
			}
		if ( !ok ) cout << "DA";
		else cout << "NU";
		cout << '\n';
	}
}