Pagini recente » Cod sursa (job #3127219) | Cod sursa (job #1632065) | Cod sursa (job #779782) | Cod sursa (job #1622060) | Cod sursa (job #2970189)
#include <fstream>
#include <vector>
#include <set>
constexpr int INF = 2e9;
constexpr int maxN = 5e4 + 10;
using namespace std;
struct muc {
int vec, cost;
};
int inD[maxN], d[maxN];
vector<muc> L[maxN];
set<pair<int, int> > s;
int main() {
ifstream fin("distante.in");
ofstream fout("distante.out");
int t, n, m, st, x, y, c;
for (fin >> t; t--;) {
fin >> n >> m >> st;
for (int i = 1; i <= n; i++) {
fin >> inD[i];
}
for (int i = 1; i <= m; i++) {
fin >> x >> y >> c;
L[x].push_back({y, c});
L[y].push_back({x, c});
}
for (int i = 1; i <= n; i++) {
d[i] = INF;
}
d[st] = 0;
s.insert({d[st], st});
while (!s.empty()) {
int crt = s.begin()->second;
s.erase(s.begin());
for (auto muc: L[crt]) {
if (d[muc.vec] > d[crt] + muc.cost) {
s.erase(make_pair(d[muc.vec], muc.vec));
d[muc.vec] = d[crt] + muc.cost;
s.insert(make_pair(d[muc.vec], muc.vec));
}
}
}
bool ok = true;
for (int i = 1; i <= n; i++) {
L[i].clear();
if (inD[i] != d[i]) {
ok = false;
break;
}
}
fout << (ok ? "DA\n" : "NU\n");
}
return 0;
}