Pagini recente » Cod sursa (job #2730964) | Cod sursa (job #990573) | Cod sursa (job #84544) | Cod sursa (job #464087) | Cod sursa (job #2830869)
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 3000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct muchie {
int destinatie, cost;
muchie(int destinatie, int cost) : destinatie(destinatie), cost(cost) {};
};
int nrGrafuri, nrNoduri, nrMuchii, sursa;
vector<int> distanteDate(NMAX), distante(NMAX);
vector<vector<muchie>> listaDeAdiacenta;
void dijkstra(int &nodPlecare) {
int maxi = 99999999;
vector<bool> vizitat(NMAX, false);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minHeap; // {cost, nodDestinatie} minHeap;
for (int i = 1; i <= nrNoduri; i++)
distante[i] = maxi;
int nodCurent = nodPlecare;
distante[nodCurent] = 0;
minHeap.push(make_pair(0, 1));
while (!minHeap.empty()) {
nodCurent = minHeap.top().second;
minHeap.pop();
if (!vizitat[nodCurent]) {
vizitat[nodCurent] = true;
for (auto &i: listaDeAdiacenta[nodCurent])
if (distante[i.destinatie] > distante[nodCurent] + i.cost) {
distante[i.destinatie] = distante[nodCurent] + i.cost;
minHeap.push(make_pair(distante[i.destinatie], i.destinatie));
}
}
}
for (int i = 1; i <= nrNoduri; i++)
if (distante[i] == maxi)
distante[i] = 0;
}
int main() {
listaDeAdiacenta = vector<vector<muchie>>(NMAX, vector<muchie>());
fin >> nrGrafuri;
for (int i = 1; i <= nrGrafuri; i++) {
fin >> nrNoduri >> nrMuchii >> sursa;
for (int j = 1; j <= nrNoduri; j++)
fin >> distanteDate[j];
if (i > 1)
for (int j = 1; j <= nrNoduri; j++)
listaDeAdiacenta[j].clear();
for (int j = 1; j <= nrMuchii; j++) {
int x, y, c;
fin >> x >> y >> c;
listaDeAdiacenta[x].push_back(muchie(y, c));
listaDeAdiacenta[y].push_back(muchie(x, c));
}
dijkstra(sursa);
bool check = true;
for (int j = 1; j <= nrNoduri; j++)
if (distante[j] != distanteDate[j]) {
check = false;
break;
}
if (check)
fout << "DA\n";
else
fout << "NU\n";
}
fin.close();
fout.close();
return 0;
}