Pagini recente » Cod sursa (job #1120667) | Cod sursa (job #2774857) | Cod sursa (job #1273139) | Cod sursa (job #2451680) | Cod sursa (job #180660)
Cod sursa(job #180660)
#include<stdio.h>
const long INF=1000001;
long m;
struct cost {unsigned x,y;
int c;};
cost a[100001];
unsigned calcul(unsigned a, unsigned b);
int main()
{ register int sw,t,ok,l;
register long i,j,n,p,min;
long k,s[50001],d[100001],aux[100001];
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&t);
for(l=1;l<=t;l++)
{ scanf("%ld%ld%ld",&n,&m,&p);
for(i=1;i<=n;i++)
{ aux[i]=d[i]=s[i]=0;
scanf("%ld",&aux[i]);
}
for(i=1;i<=m;i++)
scanf("%ld%ld%d",&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)
{ sw=calcul(k,j);
if(d[j]>d[k]+sw)
d[j]=d[k]+sw;
}
}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");
}
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;
}