Pagini recente » Cod sursa (job #971012) | Cod sursa (job #1247671) | Cod sursa (job #1043911) | Cod sursa (job #1189406) | Cod sursa (job #2824153)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int INF = numeric_limits<int>::max();
vector<int> Dijkstra(const int &nrNoduri, const int &s, const vector<vector<pair<int, int>>> &listaAdsiCosturi){
vector<bool> viz(nrNoduri + 1);
vector<int> distante(nrNoduri + 1, INF);
priority_queue<pair<int, int>, vector<pair<int,int>>, greater<>> minHeap; // primul element e distanta apoi nodul
distante[s] = 0;
minHeap.push({s, distante[s]});
while (!minHeap.empty()){
auto top = minHeap.top(); // (distanta minima, nod)
minHeap.pop();
if (viz[top.first]){
continue;
}
viz[top.first] = true;
int nodCrt = top.first;
int distCrt = top.second;
int nrVecini = listaAdsiCosturi[nodCrt].size();
for (int i = 0; i < nrVecini; i++){
int vecinCrt = listaAdsiCosturi[nodCrt][i].first;
int costCrt = listaAdsiCosturi[nodCrt][i].second;
if (!viz[vecinCrt] and (distCrt + costCrt < distante[vecinCrt])){
distante[vecinCrt] = distCrt + costCrt;
minHeap.push({vecinCrt, distante[vecinCrt]});
}
}
}
return distante;
}
int main() {
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int nrGrafuri;
fin >> nrGrafuri;
for (int i = 0; i < nrGrafuri; i++){
int nrNoduri, nrMuchii, sursa;
fin >> nrNoduri >> nrMuchii >> sursa;
vector<int> distanteBronzarel;
for(int j = 0; j < nrNoduri; j++){
int dist;
fin >> dist;
distanteBronzarel.push_back(dist);
}
vector<vector<pair<int, int>>> listaAdsiCosturi(nrNoduri + 1, vector<pair<int,int>>());
for(int j = 0; j < nrMuchii; j++){
int nod1, nod2, cost;
fin >> nod1 >> nod2 >> cost;
listaAdsiCosturi[nod1].push_back({nod2, cost});
listaAdsiCosturi[nod2].push_back({nod1, cost});
}
vector<int> distanteMinime = Dijkstra(nrNoduri, sursa, listaAdsiCosturi);
distanteMinime.erase(distanteMinime.begin());
if (distanteBronzarel == distanteMinime){
cout << "DA" << "\n";
} else {
cout << "NU" << "\n";
}
distanteBronzarel.clear();
listaAdsiCosturi.clear();
}
return 0;
}