Pagini recente » Cod sursa (job #1755553) | Cod sursa (job #3233864) | Cod sursa (job #2340832) | Cod sursa (job #2231104) | Cod sursa (job #23593)
Cod sursa(job #23593)
#include <stdio.h>
#include <stdlib.h>
//#include <malloc.h> //
#include <string.h>
//#include <mem.h> //
#define fin "distante.in"
#define fout "distante.out"
#define Nmax 50001 //
#define Mmax 100001 //
int T,N,M,*G[Nmax],*C[Nmax],Deg[Nmax];
int s,viz[Nmax],st[Nmax],d[Nmax],p[Nmax],good;
void check() {
int i,j,x,y,c,st2[Nmax];
st2[0]=0;
for (i=1;i<=st[0];++i) {
x=st[i];
for (j=0;j<Deg[x];++j) {
y=G[x][j];
c=C[x][j];
if (d[x]+c<d[y]) good=0;
if (d[x]+c==d[y]) p[y]=1;
if (!viz[y])
st2[++st2[0]]=y;
viz[y]=1;
}
}
for (i=0;i<=st2[0];++i) st[i]=st2[i];
if (st[0]) check();
}
int main() {
int i,x,y,c,list[Mmax][3];
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%i",&T);
for (;T>0;--T) {
scanf("%i%i%i",&N,&M,&s);
memset(viz,0,(N+1)*sizeof(int));
memset(Deg,0,(N+1)*sizeof(int));
memset(p,0,(N+1)*sizeof(int));
for (i=1;i<=N;++i) scanf("%i",&d[i]);
for (i=1;i<=M;++i) {
scanf("%i%i%i",&list[i][0],&list[i][1],&list[i][2]);
Deg[list[i][0]]++;
Deg[list[i][1]]++;
}
for (i=1;i<=N;++i) {
G[i]=(int*)malloc(Deg[i]*sizeof(int));
C[i]=(int*)malloc(Deg[i]*sizeof(int));
Deg[i]=0;
}
for (i=1;i<=M;++i) {
x=list[i][0]; y=list[i][1];
c=list[i][2];
G[x][Deg[x]]=y;
C[x][Deg[x]++]=c;
G[y][Deg[y]]=x;
C[y][Deg[y]++]=c;
}
//for (i=1;i<=N;++i){
//for (x=0;x<Deg[i];++x) printf("%i ",C[i][x]);
//printf("\n"); }
good=1; viz[s]=1; p[s]=1;
st[0]=1; st[1]=s;
//check();
if (d[s]!=0) good=0;
for (i=1;i<=N;++i)
if (p[i]==0) good=0;
if (good) printf("DA\n");
else printf("NU\n");
}
fclose(stdin); fclose(stdout);
return 0;
}