Pagini recente » Cod sursa (job #1354730) | Cod sursa (job #2173412) | Cod sursa (job #727379) | Cod sursa (job #1929357) | Cod sursa (job #3350016)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define INF INT_MAX
vector<int> dijkstra(vector<vector<pair<int,int>>> adj, int start){
int n = adj.size();
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
vector<int> dist(n, INF);
dist[start] = 0;
pq.emplace(0, start);
while(!pq.empty()){
auto top = pq.top();
pq.pop();
int d = top.first; //costul
int u = top.second; //nr nodului
if(d > dist[u]) continue;
for(auto vecin : adj[u]){
int v = vecin.first; //nr nodului
int w = vecin.second; //costul
if(dist[v] > d + w) {
dist[v] = d+w;
pq.emplace(dist[v], v);
}
}
}
return dist;
}
vector<vector<pair<int,int>>> citire_graf(int n, int m){
vector<vector<pair<int,int>>> adj(n+1);
while(m--){
int a,b,c;
fin >> a >> b >> c;
adj[a].push_back({b,c});
}
return adj;
}
int main(){
int t;
fin >> t;
while(t--){
int n,m,s;
fin >> n >> m >> s;
vector<int> distB(n+1, 0), distZ(n+1, 0);
vector<vector<pair<int,int>>> adj(n+1);
for(int i = 1; i<=n; i++){
fin >> distB[i];
}
adj = citire_graf(n, m);
distZ = dijkstra(adj, s);
int ok = 1;
for(int i = 1; i <=n; i++){
if(distZ[i] == INF) distZ[i] = 0;
if(distZ[i] != distB[i]) ok = 0;
}
if(ok) fout << "DA\n";
else fout << "NU\n";
}
return 0;
}