Pagini recente » Cod sursa (job #2522023) | Cod sursa (job #13334) | Cod sursa (job #64204) | Cod sursa (job #1869452) | Cod sursa (job #2640201)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin( "distante.in" );
ofstream fout( "distante.out" );
const int MaxN = 50002;
const int MaxCost = 2000000000;
int n, m, stNode;
int db[MaxN], dist[MaxN];
vector<int> G[MaxN];
vector<int> cost[MaxN];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;
void solveTest() {
int node;
q.push( { 0, stNode } );
dist[1] = 0;
while ( !q.empty() ) {
node = q.top().second;
q.pop();
for ( int i = 0; i < G[node].size(); ++i ) {
if ( dist[node] + cost[node][i] < dist[G[node][i]] ) {
dist[G[node][i]] = dist[node] + cost[node][i];
q.push( { dist[G[node][i]], G[node][i] } );
}
}
}
int i = 1;
while ( i <= n && db[i] == dist[i] ) {
++i;
}
if ( i > n ) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
int main() {
int t, x, y, c;
fin >> t;
while ( t-- ) {
fin >> n >> m >> stNode;
for ( int i = 1; i <= n; ++i ) {
G[i].clear();
dist[i] = MaxCost;
fin >> db[i];
}
for ( int i = 1; i <= m; ++i ) {
fin >> x >> y >> c;
G[x].push_back( y );
G[y].push_back( x );
cost[x].push_back( c );
cost[y].push_back( c );
}
solveTest();
}
fin.close();
fout.close();
return 0;
}