Pagini recente » Cod sursa (job #1738082) | Cod sursa (job #2733388) | Cod sursa (job #1687677) | Cod sursa (job #130357) | Cod sursa (job #2575307)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream r("distante.in");
ofstream w("distante.out");
const int oo = (1 << 30);
const int NMAX = 50001;
int T, N, M, S, dCalc[NMAX], D[NMAX], inQ[NMAX];
vector <pair <int, int> > G[NMAX];
struct comp {
bool operator()(int x, int y) {
return D[x] > D[y];
}
};
priority_queue <int, vector <int>, comp> q;
int compDist(int d1[], int d2[], int N) {
for(int i = 1; i <= N; i++)
if(d1[i] != d2[i])
return 0;
return 1;
}
void Dijkstra(int nodS, int N) {
for(int i = 1; i <= N; i++)
D[i] = oo;
D[nodS] = 0;
q.push(nodS);
inQ[nodS] = true;
while(!q.empty()) {
int nodCur = q.top();
q.pop();
inQ[nodCur] = false;
for(size_t i = 0; i < G[nodCur].size(); i++) {
int nnod = G[nodCur][i].first; // nod vecin
int cost = G[nodCur][i].second;
if(D[nodCur] + cost < D[nnod]) {
D[nnod] = D[nodCur] + cost;
if(inQ[nnod] == false) {
q.push(nnod);
inQ[nnod] = true;
}
}
}
}
}
int main() {
r>>T;
while(T--) {
r>>N>>M>>S;
for(int i = 1; i <= N; i++)
r>>dCalc[i];
for(int i = 1; i <= M; i++) {
int x, y, c;
r>>x>>y>>c;
G[x].push_back(make_pair(y, c));
}
Dijkstra(S, N);
if(compDist(D, dCalc, N))
w<<"DA\n";
else w<<"NU\n";
}
return 0;
}