Pagini recente » Cod sursa (job #2778285) | Cod sursa (job #46051) | Cod sursa (job #102654) | Cod sursa (job #1158439) | Cod sursa (job #3270010)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define NMAX 50005
#define INF 1000000000
vector<pair<int, int>> G[NMAX];
priority_queue<pair<int, int>> PQ;
int dist[NMAX];
bool viz[NMAX];
int d[NMAX];
void dijkstra(int start, int n) {
for (int i = 1; i <= n; ++i) {
dist[i] = INF;
viz[i] = 0;
}
dist[start] = 0;
PQ.push({0, start});
while (PQ.size()) {
int nod = PQ.top().second;
PQ.pop();
if (!viz[nod]) {
viz[nod] = 1;
for (auto it : G[nod]) {
if (dist[it.first] > dist[nod] + it.second) {
dist[it.first] = dist[nod] + it.second;
PQ.push({-dist[it.first], it.first});
}
}
}
}
}
int main() {
int t;
fin >> t;
while (t--) {
int n, m, s;
fin >> n >> m >> s;
for (int i = 1; i <= n; ++i) {
fin >> d[i];
}
while (m--) {
int a, b, c;
fin >> a >> b >> c;
G[a].push_back({b, c});
G[b].push_back({a, c});
}
dijkstra(s, n);
bool egale = 1;
for (int i = 1; i <= n && egale; ++i) {
if (dist[i] != d[i]) {
egale = 0;
}
}
if (egale) {
fout << "DA\n";
} else {
fout << "NU\n";
}
for (int i = 1; i <= n; ++i) {
G[i].clear();
}
}
return 0;
}