Pagini recente » Cod sursa (job #2149355) | Cod sursa (job #2231640) | Rating Sponge Bob (jnkFDH) | Cod sursa (job #2147990) | Cod sursa (job #2458631)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
typedef pair < int, int> pii;
const int NMAX = 50002;
const int INF = 2000000000;
int T, N, M, S;
int dist[NMAX], in_h[NMAX];
int zmeurica[NMAX];
vector < int > Ad[NMAX];
vector < int > Cost[NMAX];
void Dijkstra( int S )
{
priority_queue < pii, vector < pii >, greater < pii > > H;
for( int i = 1; i <= N; ++i )
{
dist[i] = INF;
in_h[i] = 0;
}
dist[S] = 0;
H.push( make_pair( 0, S ) );
while( !H.empty() )
{
int nod = H.top().second;
H.pop();
if( dist[nod] != zmeurica[nod] )
{
fout << "NU" << '\n';
return;
}
if( in_h[nod] )continue;
else in_h[nod] = 1;
for( int i = 0; i < Ad[nod].size(); ++i )
{
int w = Ad[nod][i];
if( dist[nod] + Cost[nod][i] < dist[w] )
{
dist[w] = dist[nod] + Cost[nod][i];
H.push( make_pair( dist[w], w ) );
}
}
}
fout << "DA" << '\n';
}
void Read()
{
fin >> T;
for( int t = 1; t <= T; ++t )
{
fin >> N >> M >> S;
for( int i = 1; i <= N; ++i )
fin >> zmeurica[i];
for( int i = 1; i <= M; ++i )
{
int x, y, c;
fin >> x >> y >> c;
Ad[x].push_back( y );
Cost[x].push_back( c );
Ad[y].push_back( x );
Cost[y].push_back( c );
}
Dijkstra( S );
for( int i = 1; i <= N; ++i )
{
Ad[i].clear();
Cost[i].clear();
}
}
}
int main()
{
Read();
return 0;
}