Pagini recente » Cod sursa (job #115157) | Cod sursa (job #1170638) | Cod sursa (job #1670148) | Cod sursa (job #220654) | Cod sursa (job #3338980)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "distante.in" );
ofstream fout( "distante.out" );
const int MAXN = 50'000;
int d[MAXN + 1], dist[MAXN + 1], viz[MAXN + 1];
int n;
vector<pair<int, int>> adj[MAXN + 1];
priority_queue<pair<int, int>> pq;
bool verif() {
int i = 1;
while( i <= n && d[i] == dist[i] )
i++;
return i == n + 1;
}
int main() {
int t, m, start, i, cost, x, y, u, v;
fin >> t;
while( t-- ) {
fin >> n >> m >> start;
for( i = 1; i <= n; i++ ) {
adj[i].clear();
dist[i] = INT_MAX;
viz[i] = 0;
}
for( i = 1; i <= n; i++ )
fin >> d[i];
for( i = 1; i <= m; i++ ) {
fin >> x >> y >> cost;
adj[x].push_back( { cost, y } );
adj[y].push_back( { cost, x } );
}
pq.push( { 0, start } );
dist[start] = 0;
while( !pq.empty() ) {
u = pq.top().second;
pq.pop();
if( !viz[u] ) {
viz[u] = 1;
for( auto edge : adj[u] ) {
v = edge.second;
cost = edge.first;
if( dist[u] + cost < dist[v] ) {
dist[v] = dist[u] + cost;
pq.push( { -dist[v], v } );
}
}
}
}
if( verif() )
fout << "DA\n";
else
fout << "NU\n";
}
return 0;
}