Pagini recente » Cod sursa (job #2222807) | Cod sursa (job #55872) | Cod sursa (job #1669923) | Cod sursa (job #1823292) | Cod sursa (job #1916000)
#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define pb push_back
#define st first
#define nd second
#define pii pair <int, int>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int sol[50100], d[50100], n, m, t, s, x, y, z; vector <pii> v[50100]; bool f;
set <pii> h; pii k;
int main(){
in >> t;
while(t--){
in >> n >> m >> s; f = 1;
memset(sol, 0, sizeof(sol));
for(int i = 1; i <= n; i++) d[i] = 2e9;
d[s] = 0;
for(int i = 1; i <= 50099; i++) v[i].clear();
for(int i = 1; i <= n; i++) in >> sol[i];
for(int i = 1; i <= m; i++){
in >> x >> y >> z;
v[x].pb(mp(y, z));
v[y].pb(mp(x, z));
}
h.insert(mp(0, s));
while(!h.empty()){
k = *h.begin();
h.erase(h.begin());
for(auto it : v[k.nd])
if(d[k.nd] + it.nd < d[it.st]){
if(d[it.st] != 2e9) h.erase(h.find(mp(d[it.st], it.st)));
d[it.st] = it.nd + d[k.nd];
h.insert(mp(d[it.st], it.st));
}
}
for(int i = 1; i <= n; i++) if(sol[i] != d[i]){
f = 0; break;
}
out << (f ? "DA\n" : "NU\n");
}
return 0;
}