Pagini recente » Cod sursa (job #943437) | Cod sursa (job #633575) | Cod sursa (job #3198271) | Cod sursa (job #993158) | Cod sursa (job #3003448)
#include <bits/stdc++.h>
using namespace std;
#define MAXN 50001
ifstream in("distante.in");
ofstream out("distante.out");
struct NOD {
int val, pos;
};
int n, m, s, MARE=1000000000;
int d[MAXN], dist[MAXN];
bool selected[MAXN];
vector<int> conn[MAXN], vall[MAXN];
priority_queue<NOD> pq;
bool operator<(const NOD& a, const NOD& b) {
return (a.val > b.val);
}
void solve() {
NOD nod = { 0,s };
pq.push(nod);
dist[s] = 0;
while (not pq.empty()) {
nod = pq.top(),pq.pop();
int val = nod.val, pos = nod.pos;
if (selected[pos]) continue;
selected[pos] = true;
for (int i = 0; i < conn[pos].size(); ++i) {
int vecin = conn[pos][i],cost = vall[pos][i];
if (dist[vecin] > val + cost) dist[vecin] = dist[pos] + cost, pq.push({ dist[vecin],vecin });
}
}
bool ok = true;
for (int i = 1; i <= n; ++i) {
dist[i] = ((dist[i] == MARE) ? 0 : dist[i]);
if (d[i] != dist[i]) {
ok = false; break;
}
}
out << (ok ? "DA\n" : "NU\n");
}
int main() {
int t,a,b,ds;
in >> t;
while (t--) {
memset(d, 0x0, sizeof d);
memset(dist, 0x0, sizeof dist);
memset(conn, 0x0, sizeof conn);
memset(vall, 0x0, sizeof vall);
memset(selected, 0x0, sizeof selected);
in >> n >> m >> s;
for (int i = 1; i <= n; ++i) in >> d[i];
for (int i = 0; i < m; ++i) {
in >> a >> b >> ds;
conn[a].push_back(b), vall[a].push_back(ds);
conn[b].push_back(a), vall[b].push_back(ds);
}
for (int i = 1; i <= n; ++i) dist[i]=MARE;
solve();
}
in.close(), out.close();
}