Pagini recente » Cod sursa (job #349125) | Cod sursa (job #1445303) | Cod sursa (job #387982) | Cod sursa (job #1814584) | Cod sursa (job #2970226)
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n, m, s, dist[50005], d[50005];
void dijkstra(int nod, vector<pair<int, int>> G[]) {
priority_queue<pair<int, int>> PQ; // cost, nod
PQ.push({0, nod});
while(!PQ.empty()) {
int cost = PQ.top().first;
int nod = PQ.top().second;
PQ.pop();
if(cost > d[nod]) {
continue;
}
for(auto i : G[nod]) {
int vecin = i.first, c = i.second;
if(d[vecin] > d[nod] + c) {
d[vecin] = d[nod] + c;
PQ.push({-d[vecin], vecin});
}
}
}
}
int main() {
int t;
fin >> t;
for(; t; t--) {
fin >> n >> m >> s;
vector<pair<int, int>> G[n + 2];
for(int i = 1; i <= n; i++) {
fin >> dist[i];
}
for(int i = 1; i <= m; i++) {
int x, y, c;
fin >> x >> y >> c;
G[x].push_back({y, c});
G[y].push_back({x, c});
}
for(int i = 1; i <= n; i++) {
d[i] = INF;
}
d[s] = 0;
dijkstra(s, G);
bool ok = true;
for(int i = 1; i <= n; i++) {
if(dist[i] != d[i]) {
ok = false;
break;
}
}
fout << (ok ? "DA\n" : "NU\n");
}
return 0;
}