Pagini recente » Cod sursa (job #1673468) | Cod sursa (job #2132346) | Cod sursa (job #1550478) | Cod sursa (job #1867191) | Cod sursa (job #1415750)
#include <fstream>
#include <cstring>
#include <vector>
#include <set>
#define DIM 50005
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int N,M,S;
int T;
int n;
vector <pair <int,int> > v[DIM];
int D[DIM],dist[DIM];
set <pair <int,int > > H;
int solve(){
memset(D,0x3f3f3f3f,sizeof(D));
fin>>N>>M>>S;
for(int i=1;i<=N;i++)
fin>>dist[i];
while(M--){
int x,y,cost;
fin>>x>>y>>cost;
v[x].push_back(make_pair(y,cost));
v[y].push_back(make_pair(x,cost));
}
D[S]=0;
H.insert(make_pair(0,S));
while(!H.empty()){
int val=(*H.begin()).first;
int node=(*H.begin()).second;
H.erase(*H.begin());
for(std::vector <pair <int,int> >::iterator it=v[node].begin();it!=v[node].end();it++)
if(D[it->first]>val+it->second){
D[it->first]=val+it->second;
H.insert(make_pair(D[it->first],it->first));
}
}
int ok=1;
for(int i=1;i<=N;i++){
v[i].clear();
if(dist[i]!=D[i])
ok=0;
}
return ok;
}
int main(){
fin>>T;
while(T--){
if(solve())
fout<<"DA\n";
else
fout<<"NU\n";
}
fin.close();fout.close();
return 0;
}