Pagini recente » Cod sursa (job #161472) | Cod sursa (job #2266567) | Cod sursa (job #1534329) | Cod sursa (job #2109348) | Cod sursa (job #3243091)
#include <fstream>
#include <vector>
#include <set>
using namespace std;
const int INF = 1e9 + 7;
ifstream fin("distante.in");
ofstream fout("distante.out");
void rezolva() {
int n, numar_muchii, nod_sursa;
fin >> n >> numar_muchii >> nod_sursa;
vector<int> distante_calculate(n + 1);
vector<int> distante_corecte(n + 1, INF);
vector< pair<int, int>> muchii[n + 1];
// distanțele calculate de Bronzarel
for (int i = 1; i <= n; ++i) {
fin >> distante_calculate[i];
}
for (int i = 0; i < numar_muchii; ++i) {
int nod1, nod2, cost;
fin >> nod1 >> nod2 >> cost;
muchii[nod1].push_back({nod2, cost});
muchii[nod2].push_back({nod1, cost});
}
set< pair<int, int>> set_dijkstra;
distante_corecte[nod_sursa] = 0;
set_dijkstra.insert({0, nod_sursa});
while (!set_dijkstra.empty()) {
pair<int, int> cel_mai_apropiat = *(set_dijkstra.begin());
int distanta_curenta = cel_mai_apropiat.first;
int nod_curent = cel_mai_apropiat.second;
set_dijkstra.erase(set_dijkstra.begin());
for (pair<int, int> muchie : muchii[nod_curent]) {
int vecin = muchie.first;
int cost = muchie.second;
if (distante_corecte[vecin] > distanta_curenta + cost) {
if (set_dijkstra.find({distante_corecte[vecin], vecin}) != set_dijkstra.end()) {
set_dijkstra.erase(set_dijkstra.find({distante_corecte[vecin], vecin}));
}
distante_corecte[vecin] = distanta_curenta + cost;
set_dijkstra.insert({distante_corecte[vecin], vecin});
}
}
}
for (int i = 1; i <= n; ++i) {
if (distante_calculate[i] != distante_corecte[i]) {
fout << "NU\n";
return;
}
}
fout << "DA\n";
}
int main() {
int n;
fin >> n;
while (n--) {
rezolva();
}
return 0;
}