Pagini recente » Cod sursa (job #818288) | Cod sursa (job #2346663) | Cod sursa (job #2243665) | Cod sursa (job #88795) | Cod sursa (job #3296562)
#include <climits>
#include <fstream>
#include <iostream>
#include <list>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int arr[50001];
int dist[50001];
char visited[50001];
list<pair<int, int>> adj[50001];
typedef pair<int, int> pii;
#define INF (INT_MAX)
void distante() {
int n, m, s;
fin >> n >> m >> s;
for (int i = 1; i <= n; ++i) {
fin >> arr[i];
}
for (int i = 1; i <= n; ++i) {
adj[i] = list<pair<int, int>>();
dist[i] = INF;
visited[i] = 0;
}
for (int i = 0; i < m; ++i) {
int x, y, c;
fin >> x >> y >> c;
adj[x].push_back({y, c});
adj[y].push_back({x, c});
}
dist[s] = 0;
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push({0, s});
while (!q.empty()) {
auto [d, u] = q.top();
q.pop();
if (visited[u]) {
continue;
}
visited[u] = true;
for (auto &[v, c] : adj[u]) {
if (dist[u] + c < dist[v]) {
dist[v] = dist[u] + c;
q.push({dist[v], v});
}
}
}
for (int i = 1; i <= n; ++i) {
if (dist[i] != arr[i]) {
fout << "NU\n";
return;
}
}
fout << "DA\n";
}
int main() {
int k;
fin >> k;
for(int i = 0; i < k; i++)
distante();
return 0;
}