Pagini recente » Cod sursa (job #914632) | Cod sursa (job #2425347) | Cod sursa (job #807984) | Profil AlexMotoasca | Cod sursa (job #353074)
Cod sursa(job #353074)
#include <stdio.h>
#include <vector>
#define N 1<<16
#define inf 1000000000
using namespace std;
int t,n,m,s,dist[N],cost[N],coada[N],r;
vector <pair <int,int > > v[N];
char stiva[N];
void read()
{
scanf("%d%d%d",&n,&m,&s);
int i,x,y,z;
for (i=1; i<=n; i++)
scanf("%d",&dist[i]);
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
}
void solve()
{
int i,j,ant=0,act,ok=1;
for (i=1; i<=n; i++)
cost[i]=inf,stiva[i]=0;
r=0;
coada[++r]=s;
stiva[s]=1;
cost[s]=0;
while (ok)
{
act=r;
ok=0;
for (i=ant+1; i<=act; i++)
{
stiva[coada[i]]=0;
for (j=0; j<v[coada[i]].size(); j++)
if (cost[coada[i]]+v[coada[i]][j].second<cost[v[coada[i]][j].first])
{
cost[v[coada[i]][j].first]=cost[coada[i]]+v[coada[i]][j].second;
if (!stiva[v[coada[i]][j].first])
{
coada[++r]=v[coada[i]][j].first;
stiva[coada[r]]=1;
ok=1;
}
}
}
ant=act;
}
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
int i,j;
scanf("%d",&t);
char ok;
for (i=1; i<=t; i++)
{
read();
solve();
ok=1;
for (j=1; j<=n; j++)
if (cost[j]!=dist[j])
{
ok=0;
break;
}
if (ok)
printf("DA\n");
else
printf("NU\n");
}
return 0;
}