Pagini recente » Cod sursa (job #710417) | Cod sursa (job #321970) | Cod sursa (job #544430) | Cod sursa (job #2460376) | Cod sursa (job #593585)
Cod sursa(job #593585)
#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;
}