Pagini recente » Cod sursa (job #2813207) | Cod sursa (job #3273478) | Cod sursa (job #3149612) | Cod sursa (job #2815942) | Cod sursa (job #1886977)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <cassert>
using namespace std;
#define INF 0x7FFFFFFF
#define MAX_NODES 50050
struct MyPair{
int key, val;
};
set<pair<int,int> > h;
vector<MyPair> g[MAX_NODES];
int t,n,m,s,a,b,c, d[MAX_NODES];
class Dijkstra {
public:
Dijkstra(int n) : n(n) {
d.resize(n + 1);
}
void dist(int s) {
for (int i = 1; i <= n; ++i) d[i] = INF;
d[s] = 0;
h.insert({0, s});
while (h.size() > 0) {
pair<int,int> t = *h.begin();
int x = t.second, cost, y;
h.erase(h.begin());
for (int i = 0; i < g[x].size(); ++i) {
y = g[x][i].key;
cost = g[x][i].val;
if (d[y] != INF) {
h.erase(make_pair(d[y], y));
}
if (d[y] > d[x] + cost) {
d[y] = d[x] + cost;
h.insert(make_pair(d[y], y));
}
}
}
}
bool same(int *orig) {
// for (int i = 1; i <= n; ++i) {
// cout << d[i] << " ";
// if (d[i] == INF) {
// d[i] = 0;
// }
// }
// cout << endl;
for (int i = 1; i <= n; ++i) {
if (d[i] != orig[i]) {
return false;
}
}
return true;
}
private:
int n;
vector<int> d;
};
int main() {
// Heap h(4);
// h.push(1, 10);
// h.push(2, 20);
// h.push(3, -5);
// h.push(3, -100);
// cout << h.top().val << endl;
// h.pop();
// cout << h.top().val << endl;
// h.pop();
// cout << h.top().val << endl;
freopen("distante.in","r",stdin);
freopen("distante.out", "w", stdout);
scanf("%d", &t);
while (t--) {
scanf("%d %d %d", &n, &m, &s);
for (int i = 1; i <= n; ++i) {
scanf("%d", &d[i]);
}
memset(g, 0, sizeof(g));
for (int i = 0; i < m; ++i) {
scanf("%d %d %d", &a, &b, &c);
g[a].push_back({b, c});
}
Dijkstra dij(n);
dij.dist(s);
if (dij.same(d)) {
cout << "DA" << endl;
} else {
cout << "NU" << endl;
}
}
return 0;
}