Pagini recente » Cod sursa (job #220435) | Cod sursa (job #536844) | Cod sursa (job #3348072) | Cod sursa (job #13766) | Cod sursa (job #3355017)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
void solve() {
int n, m, s;
fin>>n>>m>>s;
vector<int> d(n+1);
for (int i=1; i<=n; i++)
fin>>d[i];
vector<pair<int, int>> adj[100001];
for (int i=1; i<=m; i++) {
int a, b, c;
fin>>a>>b>>c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
vector<int> dist(n+1, 1000000000);
dist[s] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, s});
while(!pq.empty()) {
int curr_dist = pq.top().first;
int u = pq.top().second;
pq.pop();
if (curr_dist > dist[u])
continue;
for (pair<int, int> p : adj[u]) {
int v = p.first;
int cost = p.second;
if (dist[u] + cost < dist[v]) {
dist[v] = dist[u] + cost;
pq.push({dist[v], v});
}
}
}
for (int i=1; i<=n; i++)
if (dist[i] != d[i]) {
fout<<"NU"<<'\n';
return;
}
fout<<"DA"<<'\n';
}
int main() {
int t;
fin>>t;
for (int i=1; i<=t; i++)
solve();
fin.close();
fout.close();
return 0;
}