Pagini recente » Cod sursa (job #1347257) | Cod sursa (job #2367405) | Cod sursa (job #819027) | Cod sursa (job #2724295) | Cod sursa (job #2830822)
#include <fstream>
#include <algorithm>
#include <queue>
#include <iterator>
#include <vector>
#include <unordered_set>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int nrGrafuri, nrNoduri, nrMuchii, sursa;
bool check;
int p[50000], a[50000];
struct muchie {
int destinatie, cost;
muchie(int destinatie, int cost) : destinatie(destinatie), cost(cost) {};
};
vector<vector<muchie>> listaDeAdiacenta;
void dijkstra(const int startNode) {
const int maxValue = 1000000000;
vector<bool> checkedNodes(50000, false);
struct Nod {
int nod, cost;
Nod(int n, int w) : nod(n), cost(w) {};
bool operator<(const Nod &ob) const {
return cost > ob.cost;
}
};
priority_queue<Nod> minHeap;
for (int i = 1; i <= nrNoduri; i++)
a[i] = maxValue;
int nodCurent = startNode;
a[nodCurent] = 0;
minHeap.push(Nod(nodCurent, 0));
while (minHeap.size() > 0)
if (checkedNodes[minHeap.top().nod])
minHeap.pop();
else {
nodCurent = minHeap.top().nod;
for (auto i: listaDeAdiacenta[nodCurent])
if (a[i.destinatie] > a[nodCurent] + i.cost) {
a[i.destinatie] = a[nodCurent] + i.cost;
minHeap.push(Nod(i.destinatie, a[i.cost]));
}
checkedNodes[nodCurent] = true;
}
for (int i = 1; i <= nrNoduri; i++)
if (a[i] == maxValue)
a[i] = 0;
}
int main() {
listaDeAdiacenta = vector<vector<muchie>>(50000, vector<muchie>());
fin >> nrGrafuri;
for (int i = 1; i <= nrGrafuri; i++) {
fin >> nrNoduri >> nrMuchii >> sursa;
for (int j = 1; j <= nrNoduri; j++)
fin >> p[j];
if (i > 1)
for (int i = 1; i <= nrNoduri; i++)
listaDeAdiacenta[i].clear();
for (int i = 1; i <= nrMuchii; i++) {
int x, y, c;
fin >> x >> y >> c;
listaDeAdiacenta[x].push_back(muchie(y, c));
listaDeAdiacenta[y].push_back(muchie(x, c));
}
dijkstra(sursa);
check = true;
for (int j = 1; j <= nrNoduri; j++)
if (a[j] != p[j]) {
check = false;
break;
}
if (check)
fout << "DA\n";
else
fout << "NU\n";
}
fin.close();
fout.close();
return 0;
}