Pagini recente » Cod sursa (job #603161) | Cod sursa (job #697384) | Cod sursa (job #94901) | Cod sursa (job #2825072) | Cod sursa (job #3163119)
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<set>
ifstream fin("distante.in");
ofstream fout("distante.out");
#define NMAX 50005
int t;
int n, m, start;
int d[NMAX];
int sablon[NMAX];
vector<pair<int,int>> G[NMAX];
set<pair<int,int>> s;
bool viz[NMAX];
void reset(int n) {
for (int i = 1; i<=n; i++) {
d[i] = 2e9;
viz[i] = 0;
G[i].clear();
}
}
int main() {
fin >> t;
while (t--) {
fin >> n >> m >> start;
reset(n);
for (int i = 1; i<=n; i++) {
fin >> sablon[i];
}
for (int i = 1; i<=m; i++) {
int a, b, c;
fin >> a >> b >> c;
G[a].push_back({b, c});
G[b].push_back({a, c});
}
d[start] = 0;
viz[start] = 1;
s.insert({0, start});
while (!s.empty()) {
pair<int,int> el = *s.begin();
s.erase(el);
int nod = el.second;
int val = el.first;
viz[nod] = 1;
for (auto it: G[nod]) {
int nxt = it.first;
int cst = it.second;
if (viz[nxt] == 1) continue;
if (val + cst < d[nxt]) {
s.erase({d[nxt], nxt});
d[nxt] = val+cst;
s.insert({d[nxt], nxt});
}
}
}
bool ans = 1;
for (int i = 1; i<=n; i++) {
if (d[i] == 2e9) {
d[i] = 0;
}
//cout << d[i] << " ";
if (d[i] != sablon[i]) {
ans = 0;
}
}
// cout << endl;
if (ans) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
return 0;
}