Pagini recente » Cod sursa (job #566559) | Cod sursa (job #269960) | Cod sursa (job #1735350) | Cod sursa (job #3149960) | Cod sursa (job #216153)
Cod sursa(job #216153)
#include<stdio.h>
#define inf 2000000
#define Nmax 50005
#define Mmax 100005
FILE *fin = fopen("distante.in","r"),
*fout = fopen("distante.out","w");
int T,N,M,S,sol[Nmax];
int dist[Nmax];
char viz[Nmax];
struct nod{int vec,cost;nod* next;};
typedef nod* lista;
lista l[Nmax];
struct elem{int nod;elem* next;};
typedef elem* coada;
coada Q,Qf;
int valid(){
for(int i=1;i<=N;i++)
if(dist[i]!=sol[i])
return 0;
return 1;
}
int main(){
fscanf(fin,"%d",&T);
while(T--){
fscanf(fin,"%d%d%d",&N,&M,&S);
for(int i=1;i<=N;i++)
fscanf(fin,"%d",&sol[i]);
for(int i=1;i<=M;i++){
int x,y,d;
fscanf(fin,"%d %d %d",&x,&y,&d);
lista aux=new nod;
aux->vec=y;
aux->cost=d;
aux->next=l[x];
l[x]=aux;
aux=new nod;
aux->vec=x;
aux->cost=d;
aux->next=l[y];
l[y]=aux;
}
for(int i=1;i<=N;i++)
dist[i]=inf;
dist[S]=0;
Q=Qf=new elem;
Q->nod=S;
Q->next=NULL;
viz[S]=1;
while(Q){
int crt=Q->nod;
for(lista p=l[crt];p;p=p->next)
if(dist[p->vec] > dist[crt]+p->cost){
dist[p->vec]=dist[crt]+p->cost;
if(viz[p->vec]==0){
viz[p->vec]=1;
Qf->next=new elem;
Qf=Qf->next;
Qf->nod=p->vec;
Qf->next=NULL;
}
}
viz[crt]=0;
coada aux=Q;
Q=Q->next;
delete aux;
}
if(valid())
fprintf(fout,"DA\n");
else fprintf(fout,"NU\n");
}
fclose(fin);
fclose(fout);
return 0;
}