Pagini recente » Cod sursa (job #1217345) | Cod sursa (job #1217353) | Cod sursa (job #703887) | Cod sursa (job #3277146) | Cod sursa (job #2829299)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <limits.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
vector <int> dijkstra(int start, int nr_noduri, vector <vector <pair <int, int>>>& lista_costuri) {
int inf = INT_MAX;
vector <int> distanta(nr_noduri + 1, inf);
priority_queue <pair <int, int>> min_heap;
distanta[start] = 0;
min_heap.push(make_pair(0, start));
while (!min_heap.empty()) {
int u = min_heap.top().second;
min_heap.pop();
for (int i = 0; i < lista_costuri[u].size(); i++) {
int v = lista_costuri[u][i].first;
int c = lista_costuri[u][i].second;
if (distanta[u] + c < distanta[v]) {
distanta[v] = distanta[u] + c;
min_heap.push(make_pair(-distanta[v], v));
}
}
}
return distanta;
}
int main() {
int t;
in >> t;
for (int i = 1; i <= t; i++) {
int n, m, s;
in >> n >> m >> s;
vector <int> d(n + 1, 0);
for (int j = 1; j <= n; j++)
in >> d[j];
vector <vector <pair <int, int>>> v;
v.resize(n + 1);
for (int j = 1; j <= m; j++) {
int x, y, c;
in >> x >> y >> c;
v[x].push_back(make_pair(y, c));
v[y].push_back(make_pair(x, c));
}
vector <int> dist_min;
dist_min = dijkstra(s, n, v);
bool ok = true;
for (int j = 1; j <= n; j++)
if (dist_min[j] != d[j]) {
out << "NU" << "\n";
ok = false;
break;
}
if (ok == true)
out << "DA" << "\n";
}
in.close();
out.close();
return 0;
}