Pagini recente » Cod sursa (job #2472069) | Cod sursa (job #3185331) | Cod sursa (job #1808242) | Cod sursa (job #1992656) | Cod sursa (job #2828580)
#include <iostream>
#include <fstream>
#include <vector>
#include <set>
using namespace std;
const int nMax = 50005;
const int INF = 1 << 30;
vector<vector<pair<int, int>>> listaAd;
set<pair<int, int>> minHeap; // "min".. doar e un ordered set (crescator)
int inputDists[nMax], dists[nMax], nrGrafuri, n, m, s;
void dijkstra(int start) {
// Declara
fill(dists, dists + n + 1, INF);
minHeap.clear();
// 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.insert({0, start});
while (!minHeap.empty()) {
// Procesam nodul de la distanta cea mai mica fata de start
auto x = minHeap.begin()->second;
minHeap.erase(minHeap.begin());
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) {
// Nodul y e deja marcat ca trebuind sa fie procesat => il scoatem din set, ca sa il readaugam
// cu noua distanta, mai mica (ca sa nu pierdem timp incercand sa-l optimizam cu distanta veche
// mai tarziu) -- 90p->100p
if (minHeap.count({dists[y], y}) > 0) {
minHeap.erase(minHeap.find({dists[y], y}));
}
// Actualizam distanta lui y si il punem la procesat
dists[y] = dists[x] + c;
minHeap.insert({dists[y], y});
}
}
}
}
int main() {
// Input rapid
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
ifstream in("distante.in");
ofstream out("distante.out");
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";
}
}
return 0;
}