Pagini recente » Cod sursa (job #2814808) | Cod sursa (job #2850425) | Cod sursa (job #2163421) | Cod sursa (job #2232429) | Cod sursa (job #3171193)
#include <vector>
#include <queue>
#include <fstream>
#include <iostream>
#include <climits>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int LMAX = 50005;
int db[LMAX], dist[LMAX], n;
bool ok;
bool iscorect(int node) {
return db[node] == dist[node];
}
void dijkstra(int s, int m) {
vector<pair<int, int>> L[LMAX];
while (m--) {
int a, b, c;
fin >> a >> b >> c;
L[a].push_back({c, b});
L[b].push_back({c, a});
}
priority_queue<pair<int, int>> Q;
Q.push({0, s});
dist[s] = 0;
ok = iscorect(s);
while (!Q.empty() && ok) {
int node = Q.top().second, d = -Q.top().first;
Q.pop();
if (dist[node] < d) {
ok = iscorect(node);
continue;
}
for (pair<int, int> vec : L[node]) {
if (vec.first + d < dist[vec.second]) {
dist[vec.second] = vec.first + d;
Q.push({-dist[vec.second], vec.second});
}
}
}
}
int main() {
int t;
fin >> t;
while (t--) {
int m, s;
fin >> n >> m >> s;
for (int i = 1; i <= n; i++) {
fin >> db[i];
dist[i] = INT_MAX;
}
dijkstra(s, m);
if (ok) {
int i;
for (i = 1; i <= n && db[i] == dist[i]; i++);
if (i == n+1) {
fout<<"DA";
}
else {
fout<<"NU";
}
}
else{
fout<<"NU";
}
fout<<endl;
}
fin.close();
fout.close();
return 0;
}