Pagini recente » Cod sursa (job #2212597) | Cod sursa (job #956425) | Cod sursa (job #187991) | Cod sursa (job #2804682) | Cod sursa (job #188342)
Cod sursa(job #188342)
#include <stdlib.h>
#include <stdio.h>
#define N 50010
#define T 15
#define INF 250000010
int dist[N],n,m,cati[N],d[N];
struct nod{
int cine,cost;
};
int cat[T][N];
int incoada[N];
int coada[500000];
int t,s,cnt;
void start(){
int c,i,j,z;;
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for (z=1;z<=t;++z){
scanf("%d%d%d",&n,&m,&s);
for (i=1;i<=n;++i){
cat[z][i]=0;
scanf("%d",&d[i]);
}
while (m--){
scanf("%d%d%d",&i,&j,&c);
++cat[z][i];
++cat[z][j];
}
}
fclose(stdin);
freopen("distante.in","r",stdin);
scanf("%d",&t);
}
void do_job(){
int i,j,c;
int *cine[N],*cost[N];
int p,u;
int e,now;
scanf("%d%d%d",&n,&m,&s);
for (i=1;i<=n;++i){
cati[i]=0;
scanf("%d",&d[i]);
}
for (i=1;i<=n;++i){
dist[i]=INF;
cine[i]=(int*)malloc(cat[cnt][i]*sizeof(int));
cost[i]=(int*)malloc(cat[cnt][i]*sizeof(int));
cati[i]=0;
}
while (m--){
scanf("%d%d%d",&i,&j,&c);
++cati[i];
cine[i][cati[i]]=j;
cost[i][cati[i]]=c;
++cati[j];
cine[j][cati[j]]=i;
cost[j][cati[j]]=c;
}
p=u=0;
coada[u++]=s;
dist[s]=0;
while ((p^u)!=0){
e=coada[p++];
incoada[e]=0;
for (i=1;i<=cati[e];++i){
now=cine[e][i];
if(dist[now] > dist[e] + cost[e][i]){
dist[now] = dist[e] + cost[e][i];
if (!incoada[now]){
incoada[now]=1;
coada[u++]=now;
}
}
}
}
}
void print(){
int i,j,ok=1;
for (i=1;i<=n && ok;++i)
if (dist[i]!=d[i])
ok=0;
if (ok)
printf("DA\n");
else
printf("NU\n");
}
void end(){
fclose(stdin);
fclose(stdout);
exit(0);
}
int main(){
start();
for (cnt=1;cnt<=t;++cnt){
do_job();
print();
}
end();
}