Pagini recente » Cod sursa (job #2621409) | Cod sursa (job #334234) | Cod sursa (job #2590207) | Cod sursa (job #1320547) | Cod sursa (job #2983289)
#include <fstream>
#include <vector>
#include <set>
#define DIM 50005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int q, dBronz[DIM], dist[DIM];
vector<pair<int, int>> edges[DIM];
set<pair<int, int>> s;
void resetValues(int n) {
for (int i = 1; i <= n; i++) {
while (!edges[i].empty()) {
edges[i].pop_back();
}
}
for (int i = 1; i <= n; i++) {
dist[i] = INF;
}
}
void dijkstra(int source) {
dist[source] = 0;
s.insert({0, source});
while (!s.empty()) {
int node = s.begin() -> second;
s.erase(s.begin());
for (auto child: edges[node]) {
if (dist[child.first] > dist[node] + child.second) {
s.erase({dist[child.first], child.first});
dist[child.first] = dist[node] + child.second;
s.insert({dist[child.first], child.first});
}
}
}
}
int main() {
f >> q;
for (; q--;) {
int n, m, source;
f >> n >> m >> source;
resetValues(n);
for (int i = 1; i <= n; i++) {
f >> dBronz[i];
}
for (int i = 1; i <= m; i++) {
int a, b, c;
f >> a >> b >> c;
edges[a].push_back({b, c});
edges[b].push_back({a, c});
}
dijkstra(source);
int isBronzarelRight = true;
for (int i = 1; i <= n; i++) {
if (dist[i] != dBronz[i]) {
isBronzarelRight = false;
break;
}
}
if (isBronzarelRight) {
g << "DA\n";
} else {
g << "NU\n";
}
}
return 0;
}