Pagini recente » Cod sursa (job #1716797) | Cod sursa (job #2450609) | Cod sursa (job #327143) | Monitorul de evaluare | Cod sursa (job #3350023)
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define INF INT_MAX
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;
}
void bfs(int start, vector<int> &viz, vector<vector<pair<int,int>>> &adj){
queue<int> q;
viz[start] = 1;
q.push(start);
while(!q.empty()){
int nod = q.front();
q.pop();
for(auto i : adj[nod]){
int vecin = i.first;
if(viz[vecin] == 0){
q.push(vecin);
viz[vecin] = 1;
}
}
}
}
int main(){
int t;
fin >> t;
while(t--){
int n,m,s;
fin >> n >> m >> s;
vector<int> distB(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);
int ok = 1;
if(distB[s] != 0) ok = 0;
for(int i = 1; i<=n; i++){
for(auto [u,v] : adj[i]){
if(distB[u] > distB[i] + v) ok =0 ;
}
}
vector<int> viz(n+1, 0);
bfs(s, viz, adj);
for(int i = 1; i<=n; i++){
if(viz[i] == 0 && distB[i]) ok = 0;
}
if(ok) fout << "DA\n";
else fout << "NU\n";
}
return 0;
}