Pagini recente » Cod sursa (job #311262) | Cod sursa (job #2936374) | Cod sursa (job #1225474) | Cod sursa (job #332005) | Cod sursa (job #1027854)
#include <iostream>
#include <vector>
#include <queue>
#define INF 500000000
#define MAXN 50005
using namespace std;
int main(){
int n,m,t,s,x,y,c;
vector< pair<int,int> > G[MAXN];
vector<int> dTest;
vector<int> dist;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
cin>>t;
while(t--){
cin>>n>>m>>s;
dTest.resize(n+1);
dist.resize(n+1);
for(int i=1;i<=n;i++) {
cin>>dTest[i];
dist[i] = INF;
G[i].clear();
}
for(int i=0;i<m;i++) {
cin>>x>>y>>c;
G[x].push_back(pair<int,int>(y,c));
G[y].push_back(pair<int,int>(x,c));
}
dist[s] = 0;
priority_queue< pair<int,int>, vector< pair<int,int> >, greater< pair<int,int> > > pq;
pq.push(pair<int,int>(0,s));
while(!pq.empty()) {
pair<int,int> pu = pq.top();pq.pop();
int u = pu.second;int d = pu.first;
if(dist[u] !=d) continue;
for(int i=0;i<G[u].size();i++) {
pair<int,int> pv = G[u][i]; int dv = pv.second;int v = pv.first;
if(dist[v] > dist[u] + dv) {
dist[v] = dist[u] + dv;
pq.push(pair< int,int >(dist[v],v));
}
}
}
bool ok = true;
for(int i=1;i<=n;i++) {
if(dTest[i]!=dist[i])
ok = false;
}
if(ok) cout<<"DA\n";
else cout<<"NU\n";
}
return 0;
}