Cod sursa(job #593585)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 3 iunie 2011 17:28:18
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>

#define NMAX 50005
#define INF (1<<30)
#define pb push_back
#define mp make_pair
#define nod first
#define cost second

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

int T, N, Nr, M, Dinit[NMAX], D[NMAX], H[NMAX], Pos[NMAX], i, x, y, c, NodMin, Sursa;
vector< pair< int, int > > G[NMAX];
vector< pair< int, int > >::iterator it;

inline void Swap( int a, int b )
{
	int aux = H[a];
	H[a] = H[b];
	H[b] = aux;
	
	Pos[ H[a] ] = a;
	Pos[ H[b] ] = b;
}

inline void HeapDown( int NOD )
{
	if( NOD*2 <= Nr )
	{
		int Fiu = 2*NOD;
		if( Fiu+1 <= Nr && D[ H[Fiu+1] ] < D[ H[Fiu] ] )
			++Fiu;
		
		if( D[ H[NOD] ] > D[ H[Fiu] ] )
		{
			Swap( NOD, Fiu );
			HeapDown( Fiu );
		}
	}
}

inline void HeapUp( int NOD )
{
	if( NOD <= 1 ) return;
	
	int T = NOD/2;
	if( D[ H[T] ] > D[ H[NOD] ] )
	{
		Swap( NOD, T );
		HeapUp( T );
	}
}

inline void BuildHeap()
{
	for( int ii = 2; ii <= Nr; ii++ )
		HeapUp( ii );
}

inline void Scoate( int &minim )
{
	minim = H[1];
	Swap( 1, Nr-- );
	HeapDown( 1 );
}

int main()
{
	in >> T;
	while( T-- )
	{
		in >> N >> M >> Sursa; //citesc date
		for( i = 1; i <= N; i++ )
			in >> Dinit[i];
		while( M-- )
		{
			in >> x >> y >> c;
			G[x].pb( mp( y, c ) );
			G[y].pb( mp( x, c ) );
		}
		
		for( i = 1; i <= N; i++ ) //initializare
		{
			D[i] = INF;
			H[i] = Pos[i] = i;
		}
		D[Sursa] = 0;
		Nr = N;
		BuildHeap();
		
		while( Nr ) //dijkstra pe heapuri
		{
			Scoate( NodMin );
			
			for( it = G[NodMin].begin(); it != G[NodMin].end(); it++ )
				if( D[ (*it).nod ] > D[NodMin] + (*it).cost )
				{
					D[ (*it).nod ] = D[NodMin] + (*it).cost;
					HeapUp( Pos[ (*it).nod ] );
				}
		}
		
		bool corect = true;
		
		for( i = 1; i <= N; i++ ) //verificare
			if( D[i] != Dinit[i] )
			{
				corect = false;
				out << "DA\n";
				break;
			}
		if( !corect ) out<< "NU\n";
	}
	
	return 0;
}