Pagini recente » Cod sursa (job #1981040) | Cod sursa (job #2221799) | Istoria paginii runda/luca_oji4/clasament | Istoria paginii runda/cerculdeinfo-lectia17-teoriajocurilo/clasament | Cod sursa (job #555008)
Cod sursa(job #555008)
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define Nmax 50010
#define dest first
#define costs second
using namespace std;
int c[Nmax],min_c[Nmax];
bool viz[Nmax],ok=1;
struct cmp{
bool operator() (const int&a,const int&b)const{
return (min_c[a] > min_c[b]);
}
};
vector <pair <int,int> > a[Nmax];
priority_queue <int,vector <int>,cmp> q;
void dijkstra_check(){
while(!q.empty()){
int nod=q.top();
int cost=min_c[nod];
q.pop();
viz[nod]=1;
if(min_c[nod]!=c[nod]){
ok=0;return;}
for(unsigned int i=0;i<a[nod].size()&&ok;++i){
if(cost+a[nod][i].costs < min_c[a[nod][i].dest]){
min_c[a[nod][i].dest]=cost+a[nod][i].costs;
if(!viz[a[nod][i].dest])
q.push(a[nod][i].dest);
}
}
}
}
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int T;
for(scanf("%d",&T); T; --T){
int N,M,S;
scanf("%d%d%d",&N,&M,&S);
memset(viz,0,sizeof(viz));
memset(min_c,0x3f3f3f,sizeof(min_c));
ok=1;
while(!q.empty())
q.pop();
for(int i=1;i<=N;++i){
scanf("%d",&c[i]);
a[i].clear();
}
for(int i=1;i<=M;++i){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
a[x].push_back(make_pair(y,c));
a[y].push_back(make_pair(x,c));
}
min_c[S]=0;
q.push(S);
dijkstra_check();
if(ok)
printf("DA\n");
else
printf("NU\n");
}
return 0;
}