Pagini recente » Cod sursa (job #3355278) | Cod sursa (job #2595468) | Cod sursa (job #1094816) | Cod sursa (job #1625374) | Cod sursa (job #3353275)
#include <iostream>
#include <vector>
#include <queue>
#include <fstream>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
using pii = pair<int, int>;
void raspuns() {
int n, m, s;
fin >> n >> m >> s;
vector<int>bronz(n + 1);
for (int i = 1; i <= n; i++) {
fin >> bronz[i];
}
vector<vector<pii>>adj(n + 1, vector<pii>());
for (int i = 0; i < m; i++) {
int a, b, c;
fin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
priority_queue<pii, vector<pii>, greater<pii>>pq;
vector<int>dist(n + 1, __INT_MAX__);
pq.push({0, s});
dist[s] = 0;
while(!pq.empty()) {
int u = pq.top().second;
int cost = pq.top().first;
pq.pop();
if (cost > dist[u]) continue;
for (pii comb : adj[u]) {
int v = comb.first;
int w = comb.second;
if (cost + w < dist[v]) {
dist[v] = cost + w;
pq.push({dist[v], v});
}
}
}
for (int i = 1; i <= n; i++) {
if (bronz[i] != dist[i]) {
fout << "NU" << endl;
return;
}
}
fout << "DA" << endl;
}
int main(void) {
int t;
fin >> t;
while (t) {
raspuns();
t--;
}
fin.close();
fout.close();
return 0;
}