Pagini recente » Cod sursa (job #1388576) | Cod sursa (job #597326) | Cod sursa (job #1338652) | Cod sursa (job #2711514) | Cod sursa (job #2653586)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
const int oo = (1 << 30);
const int MAX = 100005;
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int n, m, d[MAX], t;
bool inCoada[MAX];
vector < pair <int, int> > G[MAX];
struct comparaDistante {
bool operator()(int x, int y) {
return d[x] > d[y];
}
};
priority_queue <int, vector < int >, comparaDistante> Coada;
void Dijkstra(int nodStart) {
for (int i = 1; i <= n; i++)d[i] = oo;
d[nodStart] = 0;
Coada.push(nodStart);
inCoada[nodStart] = true;
while (!Coada.empty()) {
int nodCurent = Coada.top();
Coada.pop();
inCoada[nodCurent] = false;
for (unsigned int i = 0; i < G[nodCurent].size(); i++) {
int vecin = G[nodCurent][i].first;
int cost = G[nodCurent][i].second;
if (d[vecin] > d[nodCurent] + cost) {
d[vecin] = d[nodCurent] + cost;
if (!inCoada[vecin]) {
inCoada[vecin] = true;
Coada.push(vecin);
}
}
}
}
}
int main() {
ios::sync_with_stdio(false);
in.tie(NULL), out.tie(NULL);
in >> t;
while (t--) {
int start, D[MAX];
in >> n >> m >> start;
for (int i = 1; i <= n; i++)in >> D[i];
for (int i = 1; i <= m; i++) {
int x, y, c;
in >> x >> y >> c;
G[x].push_back(make_pair(y, c));
}
Dijkstra(start);
bool og = true;
for (int i = 1; i <= n && og == true; i++) {
if (d[i] != D[i]) og = false;
}
if (og == true)out << "DA" << '\n';
else out << "NU" << '\n';
memset(d, 0, sizeof(d));
for (int i = 1; i <= n; i++)
G[i].clear();
}
return 0;
}