Pagini recente » Cod sursa (job #1419352) | Cod sursa (job #1542363) | Cod sursa (job #2473737) | Cod sursa (job #1766322) | Cod sursa (job #2466417)
#include <bits/stdc++.h>
#define INF 2000000000
using namespace std;
const int N = 100005;
vector < pair < int, int > > a[N];
vector < int > d(N), ds(N);
multiset < pair < int, int > > s;
void dijkstra(int root, int n)
{
ds[root] = 0;
int lg = 0;
s.insert({0, root});
while(!s.empty()) {
int v = s.begin() -> second;
lg += s.begin() -> first;
s.erase(s.begin());
for(auto x : a[v]) {
int to = x.first, len = x.second;
if(ds[to] > ds[v] + len) {
s.erase({ds[to], to});
ds[to] = ds[v] + len;
s.insert({ds[to], to});
}
}
}
bool ok = true;
for(int i = 1; i <= n && ok == true; ++i) ok = d[i] == ds[i];
if(ok == true) printf("DA\n");
else printf("NU\n");
}
int main()
{
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
int tt;
scanf("%d", &tt);
while(tt--) {
int n, m, base;
scanf("%d%d%d", &n, &m, &base);
for(int i = 1; i <= n; ++i) scanf("%d", &d[i]), ds[i] = INF, a[i].clear();
for(int i = 1; i <= m; ++i) {
int x, y, w;
scanf("%d%d%d", &x, &y, &w);
a[x].push_back({y, w});
a[y].push_back({x, w});
}
dijkstra(base, n);
}
return 0;
}