Pagini recente » Cod sursa (job #716511) | Cod sursa (job #3132570) | Cod sursa (job #290805) | Cod sursa (job #364151) | Cod sursa (job #2654640)
#include <fstream>
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#define INF 1000000000
#define DIM 50010
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T, n, m, rad, a, b, c, i, ok;
int D[DIM], sol[DIM];
vector < pair<int, int> > L[DIM];
set < pair<int, int> > S;
void initializare() {
for (int i = 1; i <= 50001; i++) {
if (!L[i].empty())
L[i].clear();
}
for (int i = 1; i <= n; i++)
D[i] = INF;
D[rad] = 0;
ok = 1;
}
void dijkstra() {
S.insert({ 0,rad });
while (!S.empty()) {
int nod = S.begin()->second;
S.erase(S.begin());
for (i = 0; i < L[nod].size(); i++) {
int vecin = L[nod][i].first;
int cost = L[nod][i].second;
if (D[vecin] > D[nod] + cost) {
S.erase({ D[vecin],vecin });
D[vecin] = D[nod] + cost;
S.insert({ D[vecin],vecin });
}
}
}
}
int main() {
fin >> T;
while (T--) {
fin >> n >> m >> rad;
for (i = 1; i <= n; i++)
fin >> sol[i];
initializare();
for (i = 1; i <= m; i++) {
fin >> a >> b >> c;
L[a].push_back({ b,c });
L[b].push_back({ a,c });
}
dijkstra();
for (i = 1; i <= n; i++)
if (D[i] != sol[i])
ok = 0;
if (ok)
fout << "DA" << "\n";
else
fout << "NU" << "\n";
}
return 0;
}