Pagini recente » Cod sursa (job #245486) | Cod sursa (job #2767430) | Cod sursa (job #2279611) | Cod sursa (job #2793595) | Cod sursa (job #2307825)
#include <iostream>
#include <fstream>
#include <set>
#include <vector>
#define MAXN 50010
using namespace std;
const int INF = 0x3f3f3f3f;
struct member {
int node, cost;
bool operator<(const member& other) const {
if (cost != other.cost)
return cost < other.cost;
return node < other.node;
}
};
vector<pair<int, int> > edges[MAXN];
set<member> heap;
int t, distances[MAXN], result[MAXN];
ifstream fin("distante.in");
ofstream fout("distante.out");
void clearMemory(int n) {
for (int i = 1; i <= n; i++) {
edges[i].clear();
distances[i] = INF;
}
heap.clear();
}
void dijkstra(int s) {
distances[s] = 0;
heap.insert({s, 0});
while (!heap.empty()) {
int from = heap.begin()->node;
heap.erase(heap.begin());
for (auto& it: edges[from]) {
int to = it.first, cost = it.second;
if (distances[to] > distances[from] + cost) {
if (distances[to] != INF) {
heap.erase({to, distances[to]});
}
distances[to] = distances[from] + cost;
heap.insert({to, distances[to]});
}
}
}
}
bool verify(int n) {
for (int i = 1; i <= n; i++)
if (result[i] != distances[i])
return false;
return true;
}
void printSolution(int n) {
if (verify(n)) {
fout << "DA\n";
}
else {
fout << "NU\n";
}
}
void solve() {
int n, m, t, s, from, to, cost;
fin >> t;
for (int k = 0; k < t; k++) {
fin >> n >> m >> s;
clearMemory(n);
for (int i = 1; i <= n; i++)
fin >> result[i];
for (int i = 0; i < m; i++) {
fin >> from >> to >> cost;
edges[from].push_back(make_pair(to, cost));
}
dijkstra(s);
printSolution(n);
}
}
int main()
{
solve();
return 0;
}