Pagini recente » Cod sursa (job #956123) | Cod sursa (job #436881) | Cod sursa (job #1289996) | Cod sursa (job #2054565) | Cod sursa (job #2348147)
#include <bits/stdc++.h>
#define MAXN 100005
#define inf (int)(1e9)
#define int_pair pair <int, int>
using namespace std;
ifstream In("distante.in");
ofstream Out("distante.out");
int N, M,v[MAXN];
vector <int_pair> ADC[MAXN];
inline void AddEdge(int x, int y, int w) {
ADC[x].push_back({y, w});
}
#define Vecin Edge.first
int Dist[MAXN];
priority_queue <int_pair, vector <int_pair>, greater <int_pair>> PQ;
void Dijkstra(int a) {
for (int i=1; i<=N; ++i)
Dist[i] = inf;
Dist[a] = 0;
PQ.push({0, a});
int_pair Top;
while (!PQ.empty()) {
Top = PQ.top();
PQ.pop();
if (Top.first != Dist[Top.second]) continue;
for (auto Edge:ADC[Top.second])
if (Dist[Vecin] > Dist[Top.second] + Edge.second)
Dist[Vecin] = Dist[Top.second] + Edge.second,
PQ.push({Dist[Vecin], Vecin});
}
}
void Rezolvare(int start,int n) {
Dijkstra(start);
int ok=0;
for (int i=1;i<=n;i++)
if(Dist[i]!=v[i])i=n,ok=1;
if(ok==1)Out<<"NU\n";
else Out<<"DA\n";
}
int main()
{
int k,start;
In>>k;
for(int i=1;i<=k;i++){
In >> N >> M>>start;
for(int i=1;i<=N;i++)
In>>v[i];
for (int i=0, x, y, w; i<M; ++i)
In >> x >> y >> w, AddEdge(x, y, w);
Rezolvare(start,N);
}
return 0;
}