Pagini recente » Cod sursa (job #1807944) | Cod sursa (job #142201) | Cod sursa (job #630528) | Cod sursa (job #2077487) | Cod sursa (job #337396)
Cod sursa(job #337396)
#include <stdio.h>
#include <string.h>
#define Nmax 150005
#define INF 2000000000
struct nod{
int y,c;
nod* next;
} *a[Nmax];
int h[Nmax],d[Nmax],db[Nmax],poz[Nmax];
int n,m,s,dh;
void swap(int i,int j){
int aux=h[i]; h[i]=h[j];
h[j]=aux;
poz[h[i]]=i;
poz[h[j]]=j;
}
void DOWN(int k){
int st=2*k,dr=st+1,min=k;
if(st<=dh && d[h[st]]<d[h[min]]) min=st;
if(dr<=dh && d[h[dr]]<d[h[min]]) min=dr;
if(min != k){
swap(k,min);
DOWN(min);
}
}
void UP(int k){
int tata=k/2;
if(tata)
if(d[h[k]] < d[h[tata]]){
swap(k,tata);
UP(tata);
}
}
void dijkstra(){
int pmin; nod* p;
while(dh){
//scot min
swap(1,dh);
dh--;
DOWN(1);
pmin = h[dh+1];
for(p=a[pmin]; p; p=p->next)
if(d[p->y] > d[pmin]+p->c){
d[p->y] = d[pmin]+p->c;
UP(poz[p->y]);
}
}
}
int write(){
int i;
for(i=1;i<=n;++i)
if(d[i] != db[i]){
printf("NU\n");
return 0;
}
printf("DA\n");
return 0;
}
void work(){
int t,i,x,y,c;
nod* aux;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for(; t; --t){
memset(a,NULL,Nmax);
scanf("%d%d%d",&n,&m,&s);
for(i=1;i<=n;++i) scanf("%d",&db[i]);
for(i=1;i<=m;++i){
scanf("%d%d%d",&x,&y,&c);
aux = new nod;
aux ->y =y;
aux ->c =c;
aux ->next=a[x];
a[x] = aux;
aux = new nod;
aux ->y =x;
aux ->c =c;
aux ->next=a[y];
a[y]=aux;
}
for(i=1;i<=n;++i){
d[i]=INF;
h[i]=poz[i]=i;
}
d[s]=0;
UP(poz[s]);
dh=n;
dijkstra();
write();
}
fclose(stdin); fclose(stdout);
}
int main(){
work();
return 0;
}