Pagini recente » Cod sursa (job #333269) | Cod sursa (job #2500551) | Cod sursa (job #2975426) | Cod sursa (job #2721861) | Cod sursa (job #2819358)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
const int INF = 2e9;
const int MAXN = 50005;
typedef pair<int,int> PII;
int distZ[MAXN];
void Solve() {
int N, M, src, a, b, c;
fin >> N >> M >> src;
for(int i = 1; i <= N; i++)
fin >> distZ[i];
vector<PII> G[N + 1];
for(int i = 1; i <= M; i++) {
fin >> a >> b >> c;
G[a].emplace_back(b, c);
G[b].emplace_back(a, c);
}
vector<int> dp(N+1, INF);
priority_queue<PII> Q; // Avem un max-heap in loc de min-heap, dar tinem costurile negative
dp[src] = 0;
Q.emplace(0, src);
while(!Q.empty()) {
int dist = -Q.top().first; // Schimbam semnul distantei
int node = Q.top().second;
Q.pop();
if(dist != dp[node]) // Daca distantele nu sunt egale, ne oprim
continue;
for(auto nxt : G[node])
if(dp[nxt.first] > dp[node] + nxt.second) {
dp[nxt.first] = dp[node] + nxt.second;
Q.emplace(-dp[nxt.first], nxt.first);
}
}
for(int i = 1; i <= N; i++)
if(distZ[i] != dp[i]) {
fout << "NU\n";
return;
}
fout << "DA\n";
}
int main() {
int t;
fin >> t;
while(t--)
Solve();
return 0;
}