Pagini recente » Istoria paginii runda/iconcurs13/clasament | Cod sursa (job #2008029) | Cod sursa (job #841569) | Cod sursa (job #1661576) | Cod sursa (job #2103556)
#include <bits/stdc++.h>
using namespace std;
#define NMAX 50005
#define INFINIT 0x3f
int T, N, M, S;
int D[NMAX], E[NMAX];
vector<pair<int, int> > graf[NMAX];
void citire() {
scanf("%d %d %d ", &N, &M, &S);
for (int i = 1; i <= N; i++) {
scanf("%d ", &D[i]);
graf[i].clear();
}
for (int i = 1; i <= M; i++) {
int a, b, c;
scanf("%d %d %d ", &a, &b, &c);
graf[a].push_back({b, c});
graf[b].push_back({a, c});
}
memset(E, INFINIT, sizeof E);
}
void calculCosturi() {
queue<int> coada;
coada.push(S);
E[S] = 0;
while (!coada.empty()) {
int nod = coada.front();
coada.pop();
for (auto it: graf[nod]) {
if(E[nod] + it.second < E[it.first]) {
E[it.first] = E[nod] + it.second;
coada.push(it.first);
}
}
}
}
void verificare() {
for (int i = 1; i <= N; i++) {
if (E[i] != D[i]) {
printf("NU\n");
return;
}
}
printf("DA\n");
}
int main() {
freopen("distante.in", "r", stdin);
freopen("distante.out", "w", stdout);
scanf("%d ", &T);
while (T--) {
citire();
calculCosturi();
verificare();
}
return 0;
}