Pagini recente » Cod sursa (job #47094) | Cod sursa (job #2179713) | Cod sursa (job #1892467) | Cod sursa (job #3003419) | Cod sursa (job #13164)
Cod sursa(job #13164)
#include <stdio.h>
#define NMAX 50001
FILE *f = fopen("distante.in","rt"), *g = fopen("distante.out","wt");
struct lista{long int nod,cost;
lista *urm;} *vf[NMAX];
long int n,i,j,k,d[NMAX],s,m;
void citire()
{
long int x,y,c;
fscanf(f,"%ld %ld %ld",&n,&m,&s);
lista *p;
for (i=1;i<=n;i++)
fscanf(f,"%ld",&d[i]);
for (i=1;i<=m;i++)
{
fscanf(f,"%ld %ld %ld",&x,&y,&c);
p=new lista;
p->nod=x;
p->cost=c;
p->urm=vf[y];
vf[y]=p;
p=new lista;
p->nod=y;
p->cost=c;
p->urm=vf[x];
vf[x]=p;
}
}
long int solve()
{
if (d[s]!=0) return 0;
long int ok=0;
lista *p;
for (i=1;i<=n;i++)
if (i!=s)
{
p=vf[i];
ok=0;
while (p)
{if (d[p->nod]+p->cost<d[i]) return 0;
if (d[p->nod]+p->cost==d[i]) ok=1;
p=p->urm;
}
if (!ok) return 0;
}
return 1;
}
void remove()
{
lista *p,*p1;
for (i=1;i<=n;i++)
{p=vf[i];
p1=vf[i];
while (p1)
{p1=p1->urm;
p=p1;
delete p;
}
}
for (i=1;i<=n;i++)
vf[i]=NULL;
}
int main()
{
long int t,cont,ok;
fscanf(f,"%ld",&t);
for (cont=1;cont<=t;cont++)
{citire();
ok=solve();
if (ok) fprintf(g,"DA\n");
else fprintf(g,"NU\n");
remove();
}
fclose(f);
fclose(g);
return 0;
}