Pagini recente » Cod sursa (job #931829) | Cod sursa (job #424784) | Cod sursa (job #903814) | Ședință 2009-10-23 | Cod sursa (job #1572667)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define pb push_back
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX = 5e4 + 1;
int T, N, M, S;
int d[NMAX], wat[NMAX];
vector<pair<int, int> > v[NMAX];
bool check() {
for (int i = 1; i <= N; ++i)
if (d[i] != wat[i])
return 0;
return 1;
}
void dijkstra(int source) {
memset(d, 0x3f, sizeof d);
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > Q;
Q.push({0, source});
d[source] = 0;
int nod, dist, vecin, cost;
while (Q.size()) {
nod = Q.top().second;
dist = Q.top().first;
Q.pop();
if (d[nod] < dist)
continue;
for (const auto& x: v[nod]) {
vecin = x.first;
cost = x.second;
if (d[vecin] > d[nod] + cost) {
d[vecin] = d[nod] + cost;
Q.push({d[vecin], vecin});
}
}
}
}
int main() {
fin >> T;
bool ans;
while (T--) {
fin >> N >> M >> S;
for (int i = 1; i <= N; ++i)
fin >> wat[i];
for (int x, y, c; M; --M) {
fin >> x >> y >> c;
v[x].pb({y, c});
}
dijkstra(S);
ans = check();
fout << (ans ? "DA\n" : "NU\n");
}
return 0;
}