Pagini recente » Cod sursa (job #2729281) | Cod sursa (job #2285711) | Cod sursa (job #710882) | Cod sursa (job #3193488) | Cod sursa (job #2828587)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
#include <queue>
using namespace std;
const int nMax = 50005;
const int INF = 1 << 30;
vector<vector<pair<int, int>>> listaAd;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> minHeap;
int inputDists[nMax], dists[nMax], nrGrafuri, n, m, s;
void dijkstra(int start) {
// Declara
fill(dists, dists + n + 1, INF);
// Incepem algoritmul din nodul de start
dists[start] = 0;
// Punem in set perechea {0, [nod start]}, 0 fiind distanta de la start pana la el insusi
minHeap.push({0, start});
while (!minHeap.empty()) {
// Procesam nodul de la distanta cea mai mica fata de start
auto x = minHeap.top().second;
minHeap.pop();
for (auto &e: listaAd[x]) {
auto y = e.first, c = e.second;
// Obtinem un drum mai scurt (fata de cel gasit) daca trecem prin x
if (dists[y] > dists[x] + c) {
// Actualizam distanta lui y si il punem la procesat
dists[y] = dists[x] + c;
minHeap.push({dists[y], y});
}
}
}
}
int main() {
ifstream in("distante.in");
ofstream out("distante.out");
// Input rapid
ios_base::sync_with_stdio(false);
in.tie(nullptr);
in >> nrGrafuri;
for (int k = 1; k <= nrGrafuri; k++) {
// Input
in >> n >> m >> s;
for (int i = 1; i <= n; i++) {
in >> inputDists[i];
}
listaAd.clear();
listaAd.resize(n + 1);
for (int i = 1; i <= m; i++) {
int x, y, c;
in >> x >> y >> c;
listaAd[x].push_back({y, c});
listaAd[y].push_back({x, c});
}
dijkstra(s);
int ok = 1;
for (int i = 1; i <= n; i++) {
if (inputDists[i] != dists[i]) {
ok = 0;
break;
}
}
if (ok) {
out << "DA\n";
} else {
out << "NU\n";
}
}
in.close();
return 0;
}