Pagini recente » Cod sursa (job #2933207) | Cod sursa (job #2482655) | Autentificare | Cod sursa (job #1356411) | Cod sursa (job #1826741)
#include <cstdio>
using namespace std;
const int inf = 1000000000;
const int maxn = 50000;
int x;
int n,m,s;
int d1[maxn],d2[maxn];
int c[20000][20000],viz[maxn];
void Read()
{
int t1,t2,co;
scanf("%i %i %i",&n,&m,&s);
for(int i=1;i<=n;i++)
{
scanf("%i",&d1[i]);
viz[i] = d2[i] = 0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i == j)
c[i][j] = 0;
else
c[i][j] = inf;
}
}
for(int i=1;i<=m;i++)
{
scanf("%i %i %i",&t1,&t2,&co);
c[t1][t2] = co;
}
}
void Pasul1()
{
for(int i=1;i<=n;i++)
{
d2[i] = c[s][i];
if(i == s)
viz[i] = 1;
else
viz[i] = 0;
}
}
int minim()
{
int loc = 0;
int min = inf;
for(int i=1;i<=n;i++)
{
if(viz[i] == 0 && d2[i] != inf)
{
if(d2[i] < min)
{
min = d2[i];
loc = i;
}
}
}
return loc;
}
void Pasul2()
{
int loc;
for(int i=2;i<=n;i++)
{
loc = minim();
viz[loc] = 1;
for(int j=1;j<=n;j++)
{
if(d2[j] > d2[loc] + c[loc][j])
d2[j] = d2[loc] + c[loc][j];
}
}
}
void Verificarea()
{
int f=0;
for(int i=1;i<=n;i++)
{
if(d1[i] != d2[i])
{
f=1;
}
}
if(f==1)
printf("Nu\n");
else
printf("Da\n");
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%i",&x);
for(int i=1;i<=x;i++)
{
Read();
Pasul1();
Pasul2();
Verificarea();
}
return 0;
}