Pagini recente » Cod sursa (job #1325014) | Cod sursa (job #407249) | Cod sursa (job #2331073) | Cod sursa (job #1867804) | Cod sursa (job #3128320)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
#define INF (1 << 30)
typedef pair<int, int> iPair;
vector<pair<int, int>> adj[50001];
int T;
int N, M, S;
int dist_in[50001];
int d[50001];
int main()
{
f >> T;
for (int l = 1; l <= T; l++) {
f >> N >> M >> S;
for (int c = 1; c <= N; c++)
f >> dist_in[c];
for (int k = 1, x, y, w; k <= M; k++) {
f >> x >> y >> w;
adj[x].push_back({y, w});
}
for (int p = 1; p <= N; p++)
d[p] = INF;
priority_queue<iPair, vector<iPair>, greater<iPair> >
pq;
d[S] = 0;
pq.push(make_pair(0, S));
while (!pq.empty()){
int node = pq.top().second;
pq.pop();
for(int i = 0; i < (int) adj[node].size(); i++) {
if (d[node] + adj[node][i].second < d[adj[node][i].first]) {
d[adj[node][i].first] = d[node] + adj[node][i].second;
pq.push(make_pair(d[adj[node][i].first], adj[node][i].first));
}
}
}
bool is_not = false;
for (int q = 1; q <= N; q++) {
if(dist_in[q] != d[q]) {
is_not = true;
g << "NU\n";
break;
}
}
if (is_not == false)
g << "DA\n";
}
return 0;
}