Pagini recente » Cod sursa (job #1841059) | Cod sursa (job #1062442) | Cod sursa (job #2110088) | Cod sursa (job #568266) | Cod sursa (job #65423)
Cod sursa(job #65423)
#include <stdio.h>
#include <vector>
#include <queue>
#define inf (int)1e9
#define nmax 50005
#define pb push_back
using namespace std;
typedef pair<int,int> ii;
int n,m,s,T,d[nmax],n1,n2,cst,D[nmax];
ii aux;
vector <ii> e[nmax];
void dijkstra(int s) {
priority_queue < ii,vector<ii>,greater<ii> > Q;
for(int i = 1; i <= n; i++) D[i] = inf; D[s] = 0;
Q.push(ii(0,s));
while(!Q.empty()) {
aux = Q.top();
if(aux.first == D[aux.second]) {
if(D[aux.second] != d[aux.second]) return ;
for(int i = 0; i < (int)e[aux.second].size(); i++)
if(D[e[aux.second][i].first] > D[aux.second] + e[aux.second][i].second) {
D[e[aux.second][i].first] = D[aux.second] + e[aux.second][i].second;
Q.push(ii(D[e[aux.second][i].first],e[aux.second][i].first));
}
}
Q.pop();
}
}
int solve() {
scanf("%d%d%d",&n,&m,&s);
for(int i = 1; i <= n; i++) e[i].clear();
for(int i = 1; i <= n; i++) scanf("%d",&d[i]);
for(int i = 1; i <= m; i++) {
scanf("%d%d%d",&n1,&n2,&cst);
e[n1].pb(ii(n2,cst));
e[n2].pb(ii(n1,cst));
}
dijkstra(s);
for(int i = 1; i <= n; i++) if(d[i] != D[i]) return 0;
return 1;
}
int main() {
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
for(int t = 1; t <= T; t++) {
if(solve()) printf("DA\n");
else printf("NU\n");
}
return 0;
}