Pagini recente » Cod sursa (job #387616) | Cod sursa (job #1718404) | Cod sursa (job #1451698) | Cod sursa (job #1185446) | Cod sursa (job #3128317)
#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 main()
{
f >> T;
for (int i = 1; i <= T; i++) {
f >> N >> M >> S;
for (int p = 1; p <= N; p++) {
f >> dist_in[p];
}
for (int k = 1, x, y, w; k <= M; k++) {
f >> x >> y >> w;
adj[x].push_back({y, w});
}
vector<int> d(N + 1);
vector<int> p(N + 1);
for (int i = 1; i <= N; i++) {
d[i] = INF;
p[i] = -1;
}
priority_queue<iPair, vector<iPair>, greater<iPair> >
pq;
d[S] = 0;
p[S] = -1;
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;
p[adj[node][i].first] = node;
pq.push(make_pair(d[adj[node][i].first], adj[node][i].first));
}
}
}
bool is_not = false;
for (int i = 1; i <= N; i++) {
if(dist_in[i] != d[i]) {
is_not = true;
g << "NU\n";
break;
}
}
if (is_not == false)
g << "DA\n";
}
return 0;
}