Pagini recente » Cod sursa (job #1792692) | Cod sursa (job #1385551) | Cod sursa (job #1299853) | Cod sursa (job #144718) | Cod sursa (job #2814629)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct str
{
int cost;
int nod;
};
constexpr int NMAX = 5e4 + 3, INF = 1e9;
int d[NMAX], n, m, a, b, c, t, s;
pair <int, int> aint[4 * NMAX];
bool sel[NMAX];
void update(int nod, int L, int R, int poz, int val)
{
if(L == R){
aint[nod].first = val;
aint[nod].second = poz;
return;
}
int mid = (L + R) >> 1;
if(poz <= mid)
update(2 * nod, L, mid, poz, val);
else update(2 * nod + 1, mid + 1, R, poz, val);
if(aint[2 * nod].first < aint[2 * nod + 1].first)
aint[nod] = aint[2 * nod];
else aint[nod] = aint[2 * nod + 1];
}
void dijkstra ()
{
vector <str> G[NMAX];
vector <int> ans;
int x;
fin >> n >> m >> s;
ans.push_back(0);
for(int i = 1; i <= n; i++)
fin >> x, ans.push_back(x);
for(int i = 1; i <= m; i++) {
fin >> a >> b >> c;
G[a].push_back({c, b});
G[b].push_back({c, a});
}
int dmin, poz;
for(int i = 1; i < NMAX; i++) {
sel[i] = false;
update(1, 1, n, i, INF);
d[i] = INF;
}
d[s] = 0;
update(1, 1, n, s, 0);
for(int i = 1; i <= n; i++)
{
dmin = aint[1].first;
poz = aint[1].second;
sel[poz] = true;
update(1, 1, n, poz, INF);
for(auto it: G[poz]) {
if(!sel[it.nod] && dmin + it.cost < d[it.nod]) {
d[it.nod] = dmin + it.cost;
update(1, 1, n, it.nod, dmin + it.cost);
}
}
}
bool ok = true;
for(int i = 1; i <= n && ok; i++) {
if(d[i] != ans[i])
ok = false;
}
fout << (ok ? "DA" : "NU" ) << '\n';
}
int main()
{
fin >> t;
for(int i = 1; i <= t; i++)
dijkstra();
return 0;
}