Pagini recente » Cod sursa (job #196447) | Cod sursa (job #2050612) | Cod sursa (job #2465708) | Cod sursa (job #1201827) | Cod sursa (job #2476993)
#include<cstdio>
#include<vector>
#include<set>
#define INF 1<<24
#define x first
#define y second
using namespace std;
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int n,m,s,t;
scanf("%d", &t);
for(int k=1;k<=t;k++){
scanf("%d%d%d", &n, &m, &s);
int v[n+1];
vector <vector <pair<int, int> > > G(n+1);
vector <int> d(n+1, INF);
set <pair <int, int> > q;
for(int i=1;i<=n;i++)
scanf("%d", &v[i]);
for(int i=1;i<=m;i++){
int x,y,c;
scanf("%d%d%d", &x, &y, &c);
G[x].push_back(make_pair(c, y));
G[y].push_back(make_pair(c, x));
}
d[s]=0;
q.insert(make_pair(0, s));
while(!q.empty()){
int nod=(*q.begin()).y;
q.erase(q.begin());
for(auto j: G[nod]){
if(d[nod]+j.x<d[j.y]){
q.erase(make_pair(d[j.y], j.y));
d[j.y]=d[nod]+j.x;
q.insert(make_pair(d[j.y], j.y));
}
}
}
bool ok=true;
for(int i=1;i<=n;i++){
if(d[i]==INF)
if(0!=v[i])
ok=false;
if(d[i]!=v[i])
ok=false;
}
if(ok==false)
printf("NU\n");
else
printf("DA\n");
d.clear();
for(int i=1;i<=n;i++)
G[i].clear();
}
return 0;
}