Pagini recente » Cod sursa (job #84279) | Cod sursa (job #2774074) | Cod sursa (job #890183) | Cod sursa (job #1125336) | Cod sursa (job #199286)
Cod sursa(job #199286)
#include<stdio.h>
#include<limits.h>
#define INF INT_MAX/2-1
#define NMAX 50000 //50
#define MMAX 10000 //100
struct muchie{unsigned short a,b,c;};
int main(){
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int n,m,i,j,k,t,nrt,ok,nrsel,gata,min;
muchie w[MMAX];
int o[NMAX+1],d[NMAX+1];
unsigned short s[NMAX+1],x,y,start;
int c[NMAX+1][NMAX+1];
scanf("%d",&t);
for(nrt=0;nrt<t;++nrt){
scanf("%d%d%hu",&n,&m,&start);
for(i=1;i<=n;++i) scanf("%d",&o[i]);
for(i=0;i<m;++i) scanf("%hu%hu%hu",&w[i].a,&w[i].b,&w[i].c);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j) c[i][j]=INF;
for(i=1;i<=n;++i) c[i][i]=0;
for(i=0;i<m;++i){
x=w[i].a;y=w[i].b;
c[x][y]=w[i].c;
}
for(i=1;i<=n;++i){
s[i]=0;
d[i]=c[start][i];
}
s[start]=1;nrsel=1;
gata=0;k=0;
do{
min=INF+INF;
for(i=1;i<=n;++i)
if(!s[i]&&d[i]<min){
min=d[i];k=i;
}
nrsel++;
if(k&&(d[k]==INF||nrsel==n)) gata=1;
else{
s[k]=1;
for(j=1;j<=n;++j)
if(!s[j]&&d[j]>d[k]+c[k][j])
d[j]=d[k]+c[k][j];
}
}while(!gata);
for(i=1;i<=n;++i)
if(d[i]==INF) d[i]=0;
ok=1;
for(i=1;i<=n&&ok;++i) ok=d[i]==o[i];
ok?printf("DA\n"):printf("NU\n");
}
return 0;
}