Pagini recente » Cod sursa (job #2230596) | Cod sursa (job #993329) | Cod sursa (job #214622) | Cod sursa (job #2045887) | Cod sursa (job #1614545)
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
#define Nmax 50005
#define INF 1e5
int n,m,t,L[100005],x,y,c,L1[100005];
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=1;i<=n;i++){
L1[i]=INF;
L1[s]=0;
}
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;
int s;
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';
for(int i=1;i<=n;i++)
L[i]=INF;
for(int i=1;i<=n;i++)
G[i].clear();
t--;
}
return 0;
}