Pagini recente » Cod sursa (job #157665) | Cod sursa (job #3183156) | Cod sursa (job #2520686) | bazat1 | Cod sursa (job #3227155)
#include <fstream>
#include <vector>
#include <set>
const int INF = 1e9 + 7;
std::ifstream fin("distante.in");
std::ofstream fout("distante.out");
void solve () {
int n, m, s;
fin >> n >> m >> s;
s--;
std::vector<int> his_dist(n);
std::vector<int> dist(n, INF);
std::vector<std::pair<int, int>> edges[n];
for (auto &elem : his_dist) {
fin >> elem;
}
while (m--) {
int x, y, z;
fin >> x >> y >> z;
--x, --y;
edges[x].push_back({y, z});
}
std::set<std::pair<int, int>> st;
st.insert({s, 0});
dist[s] = 0;
while (!st.empty()) {
auto [curr_dist, curr_node] = *(st.begin());
st.erase(st.begin());
for (auto [neigh, val] : edges[curr_node]) {
if (dist[neigh] > curr_dist + val) {
if (st.find({dist[neigh], neigh}) != st.end()) {
st.erase(st.find({dist[neigh], neigh}));
}
dist[neigh] = curr_dist + val;
st.insert({dist[neigh], neigh});
}
}
}
for (int i = 0; i < n; ++i) {
if (his_dist[i] != dist[i]) {
fout << "Nu\n";
return;
}
}
fout << "Da\n";
}
int main() {
int t;
fin >> t;
while (t--) {
solve();
}
return 0;
}