Pagini recente » Cod sursa (job #2140142) | Cod sursa (job #1125307) | Cod sursa (job #587602) | Cod sursa (job #670615) | Cod sursa (job #95327)
Cod sursa(job #95327)
#include<stdio.h>
#include<string.h>
#define inf 10000
#define val 20000
int n,m,xp,p[val],d[val],s[val],t,c[val][val];
void citire()
{
scanf("%d%d%d", &n, &m, &xp);
for (int o=1; o<=n; o++)
scanf("%d", &p[o]);
int i,x,y,z;
for (i=1; i<=n; i++)
for (int j=1; j<=n; j++)
c[i][j]=inf;
for (i=1; i<=n; i++)
c[i][i]=0;
for (i=1; i<=m; i++)
{
scanf("%d%d%d", &x, &y, &z);
c[x][y]=z;
}
}
void min(int &k)
{
int m=2*inf;
for (int i=1; i<=n; i++)
if (s[i]==0 && d[i]<m)
{
m=d[i];
k=i;
}
}
void verificare()
{
for (int i=1; i<=n; i++)
if (d[i]!=p[i])
{
printf("NU\n");
return;
}
printf("DA\n");
}
void dijkstra()
{
for (int i=1; i<=n; i++)
{
d[i]=c[xp][i];
s[i]=0;
}
s[xp]=1;
int g=1;
int x=0,k;
while (g==1)
{
min(k);
++x;
if (d[k]==inf || x==n)
g=0;
else
{
s[k]=1;
for (int j=1; j<=n; j++)
if (s[j]==0 && d[j]>d[k]+c[k][j])
{
d[j]=d[k]+c[k][j];
}
}
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d", &t);
for (int u=1; u<=t; u++)
{
citire();
dijkstra();
verificare();
}
fclose(stdin);
fclose(stdout);
return 0;
}