Pagini recente » Cod sursa (job #2696355) | Cod sursa (job #2480410) | Cod sursa (job #2480478) | Cod sursa (job #238403) | Cod sursa (job #209341)
Cod sursa(job #209341)
#include<stdio.h>
#include<string.h>
#define N 50005
#define oo 0x3f3f3f3f
#define Dim 8192
FILE*f=fopen("distante.in","r");
FILE*g=fopen("distante.out","w");
char ax[Dim];
int n,m,S;
int pz;
struct nod { int info, cost; nod *urm;};
nod *prim[N];
int D[N];
int viz[N];
int bronz[N];
inline void cit(int &x)
{
x=0;
while(ax[pz]>'9' || ax[pz]<'0')
if(++pz==Dim) fread(ax,1,Dim,f),pz=0;
while(ax[pz]<='9' && ax[pz]>='0')
{
x=x*10+ax[pz]-'0';
if(++pz==Dim) fread(ax,1,Dim,f), pz=0;
}
}
inline void insert(int x, int y, int cst)
{
nod *p,*q;
p=new nod;
p->info=y;
p->cost=cst;
p->urm=prim[x];
prim[x]=p;
q=new nod;
q->info=x;
q->cost=cst;
q->urm=prim[y];
prim[y]=q;
}
void read()
{
cit(n);
cit(m);
cit(S);
int x,y,z;
for(int i=1;i<=n;++i) cit(bronz[i]);
while(m--)
{
cit(x); cit(y); cit(z);
insert(x,y,z);
}
}
void reset()
{
int i;
for(i=1;i<=n;++i)
{
prim[i]=NULL;
}
memset(D,oo,sizeof(D));
memset(viz,0,sizeof(viz));
}
int belman()
{
int C[N],x;
int p=0,u=0;
C[0]=S;
D[S]=0;
int nr=1;
nod *q;
while(nr)
{
x=C[p];
p=(p+1)%N;
nr--;
viz[x]=0;
for(q=prim[x];q;q=q->urm)
if(D[q->info] > D[x] + q->cost)
{
D[q->info] = D[x] + q->cost;
if(!viz[q->info])
{
viz[q->info]=1;
u=(u+1)%N;
++nr;
C[u] = q->info;
}
}
}
int i;
for(i=1;i<=n;++i)
{
if(D[i]==oo) D[i]=0;
if(D[i]!=bronz[i]) return 0;
}
return 1;
}
int main()
{
int t;
cit(t);
while(t--)
{
reset();
read();
if(belman()) fprintf(g,"DA\n");
else fprintf(g,"NU\n");
}
return 0;
}