Pagini recente » Cod sursa (job #2784646) | Cod sursa (job #803215) | Cod sursa (job #2278620) | Cod sursa (job #2823776) | Cod sursa (job #2474511)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
constexpr int INF = 0x3f3f3f3f;
typedef pair<int, int> pcy;
int T, N, M, x, y, c, S, s[50003], D[50003];
vector<pair<int, int>> G[50003];
priority_queue<pcy, vector<pcy>, greater<pcy>> Q;
bool sel[50003];
void dijkstra(int pl);
int main() {
f >> T;
for(int t = 1; t <= T; t++) {
f >> N >> M >> S;
for(int i = 1; i <= N; i++)
f >> s[i];
for(int i = 1; i <= M; i++) {
f >> x >> y >> c;
G[x].push_back({c, y});
}
dijkstra(S);
bool ok = true;
for(int i = 1; i <= N; i++)
if(s[i] != D[i]) { ok = false; break; }
g << (ok? "DA" : "NU") << "\n";
for(int i = 1; i <= N; i++)
G[i].clear();
}
return 0;
}
void dijkstra(int pl) {
for(int i = 1; i <= N; i++) {
D[i] = INF, sel[i] = false;
}
D[pl] = 0;
sel[pl] = true;
for(auto i : G[pl]) {
D[i.second] = i.first;
Q.push(i);
}
while(!Q.empty()) {
while(!Q.empty() && sel[Q.top().second])
Q.pop();
if(Q.empty()) break;
int c = Q.top().first, y = Q.top().second;
sel[y] = true;
Q.pop();
for(auto i : G[y])
if(c + i.first < D[i.second]) {
D[i.second] = c + i.first;
Q.push({D[i.second], i.second});
}
}
}