Pagini recente » Cod sursa (job #368009) | Cod sursa (job #1408843) | Cod sursa (job #528527) | Cod sursa (job #1841246) | Cod sursa (job #1035851)
#include <stdio.h>
using namespace std;
const int N=50001;
const int M=100001;
const int INF=1000000000;
const int NIL=-1;
struct nod
{
int val;
int urm;
int cost;
};
nod a[2*M];
int q[N],list[N],sum[N],sum1[N],nr,p,u,n,m,t,s;
bool inq[N];
int main()
{
FILE *in,*out;
in=fopen("distante.in","r");
out=fopen("distante.out","w");
int i,j,x,y,poz,c;
bool corect;
fscanf(in,"%d",&t);
for(j=1;j<=t;j++)
{
fscanf(in,"%d%d%d",&n,&m,&s);
for(i=1;i<=n;i++) fscanf(in,"%d",&sum1[i]);
nr=0;
for(i=1;i<=n;i++) {list[i]=NIL; sum[i]=INF; inq[i]=0;}
for(i=1;i<=m;i++)
{
fscanf(in,"%d%d%d",&x,&y,&c);
a[nr].val=y;
a[nr].urm=list[x];
list[x]=nr;
a[nr].cost=c;
nr++;
a[nr].val=x;
a[nr].urm=list[y];
list[y]=nr;
a[nr].cost=c;
nr++;
}
q[0]=s;
inq[s]=1;
sum[s] = 0;
p=0; u=1;
while(p!=u)
{
x=q[p];
inq[x]=0;
p=(p+1)%n;
poz=list[x];
while(poz!=NIL)
{
y=a[poz].val;
if(sum[x] + a[poz].cost < sum[y])
{
sum[y] = sum[x] + a[poz].cost;
if(inq[y]==0)
{
inq[y]=1;
q[u]=y;
u=(u+1)%n;
}
}
poz=a[poz].urm;
}
}
corect=1;
for(i=1;i<=n;i++)
{
//fprintf(out,"%d ",sum[i]);
if(sum[i]!=sum1[i]) corect=0;
}
//fprintf(out,"\n");
if(corect) fprintf(out,"DA\n");
else fprintf(out,"NU\n");
}
return 0;
}