Pagini recente » Cod sursa (job #1350290) | Cod sursa (job #942733) | Cod sursa (job #2414229) | Cod sursa (job #1301043) | Cod sursa (job #180629)
Cod sursa(job #180629)
#include<stdio.h>
const long INF=1000001;
long i,j,k=1,d[100001],t,s[50001],n,m,p,min,l,aux[100001],ok;
struct cost {unsigned x,y,c;};
cost a[100001];
unsigned calcul(unsigned a, unsigned b);
int main()
{ freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%ld",&t);
for(l=1;l<=t;l++)
{ scanf("%ld%ld%ld",&n,&m,&p);
for(i=1;i<=n;i++)
scanf("%ld",&aux[i]);
for(i=1;i<=m;i++)
scanf("%ld%ld%ld",&a[i].x,&a[i].y,&a[i].c);
for(i=1;i<=n;i++)
if(i!=p)d[i]=calcul(p,i);
s[p]=1;
for(i=1;i<=n-1;i++)
{ min=100001;
for(j=1;j<=n;j++)
if(s[j]==0)
if(d[j]<min)
{min=d[j];k=j;}
s[k]=1;
for(j=1;j<=n;j++)
if(s[j]==0)
if(d[j]>d[k]+calcul(k,j))
d[j]=d[k]+calcul(k,j);
}ok=1;
for(i=1;i<=n&&ok;i++)
if(d[i]!=aux[i]) ok=0;
if(!ok) printf("%s","NU\n");
else printf("%s","DA\n");
for(i=1;i<=n;i++)
aux[i]=d[i]=s[i]=0;
k=1;
}
return 0;
}
unsigned calcul(unsigned f,unsigned g)
{ int i;
for(i=1;i<=m;i++)
if((a[i].x==f&&a[i].y==g)||(a[i].x==g&&a[i].y==f))
return a[i].c;
return INF;
}