Pagini recente » Cod sursa (job #2618872) | Cod sursa (job #2338898) | Cod sursa (job #2587370) | Cod sursa (job #1549737) | Cod sursa (job #1614468)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
#define Nmax 100000
#define INF 1e5
int n,m,t,s,L[Nmax],x,y,c,L1[Nmax];
vector <pair <int, int> > G[Nmax];
vector <int> T;
int cmp(const int &a, const int &b){
return(L1[a] > L1[b]);
}
void dijkstra(int s){
int node;
T.push_back(s);
make_heap(T.begin(),T.end(),cmp);
for(int i=2;i<=n;i++)
L1[i]=INF;
while(!T.empty()){
node=T.front();
pop_heap(T.begin(),T.end(),cmp);
T.pop_back();
for(int i=0;i<G[node].size();i++)
if(L1[G[node][i].first] > L1[node] + G[node][i].second){
L1[G[node][i].first] = L1[node] + G[node][i].second;
T.push_back(G[node][i].first);
push_heap(T.begin(),T.end(),cmp);
}
}
}
int main(){
in>>t;
while(t){
in>>n>>m>>s;
for(int i=1;i<=n;i++)
in>>L[i];
for(int i=1;i<=m;i++){
in>>x>>y>>c;
G[x].push_back({y,c});
}
dijkstra(s);
int ok=1;
for(int i=1;i<=n;i++)
if(L1[i] != L[i]){
ok=0;
break;
}
if(ok == 1)
out<<"DA"<<'\n';
else
out<<"NU"<<'\n';
t--;
}
return 0;
}