Pagini recente » Cod sursa (job #2403516) | Cod sursa (job #2685088) | Cod sursa (job #3219558) | Cod sursa (job #1159818) | Cod sursa (job #2458616)
#include <fstream>
#include <queue>
#include <vector>
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;
int N, M, source;
int d[NMAX], d2[NMAX];
vector <int> Ad[NMAX];
vector <int> Cost[NMAX];
bool in_h[NMAX];
void Do();
void Read()
{
int a, b, d;
fin >> T;
for( int i = 1; i <= T; ++i )
{
fin >> N >> M >> source;
for( int i = 1; i <= N; ++i )
fin >> d2[i];
for( int i = 1; i <= M; ++i )
{
fin >> a >> b >> d;
Ad[a].push_back( b );
Cost[a].push_back( d );
Ad[b].push_back( a );
Cost[b].push_back( d );
}
Do();
}
}
void Do()
{
for( int i = 1; i <= N; ++i )
d[i] = INF;
d[source] = 0;
priority_queue <pii, vector<pii>, greater<pii> > Heap;
int nod;
Heap.push( make_pair( 0, source ) );
while( !Heap.empty() )
{
nod = Heap.top().second;
Heap.pop();
if( in_h[nod] ) continue;
else in_h[nod] = true;
if( d[nod] != d2[nod] ) break;
for( int i = 0; i < Ad[nod].size(); ++i )
{
int w = Ad[nod][i];
if( d[nod] + Cost[nod][i] < d[w] )
{
d[w] = d[nod] + Cost[nod][i];
Heap.push( make_pair( d[w], w ) );
}
}
}
bool ok = true;
for( int i = 1; i <= N; ++i )
if( d[i] != d2[i] )
{
ok = false;
break;
}
( ok ) ? fout << "DA\n" : fout << "NU\n";
for( int i = 1; i <= N; ++i )
{
Ad[i].clear();
Cost[i].clear();
in_h[i] = false;
}
}
int main()
{
Read();
fin.close();
fout.close();
return 0;
}