Pagini recente » Cod sursa (job #2008537) | Cod sursa (job #1769059) | Cod sursa (job #2097598) | Monitorul de evaluare | Cod sursa (job #1120337)
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 50005
struct element{int n,c;};
int n, m, s, a, b, c, i, nrg, ii, t, inc, sf, x;
vector <element> ma[nmax];
vector <element> ::iterator it;
element el;
int dmin[nmax], co[nmax];
bool ex[nmax], ok;
void citire()
{
scanf("%ld %ld %ld",&n,&m,&s);
for (i=1;i<=n;i++)
{
scanf("%ld",&dmin[i]);
ex[i]=0; ma[i].clear();
}
for(i=1;i<=m;i++)
{
scanf("%ld %ld %ld",&a,&b,&c);
el.n=b; el.c=c;
ma[a].push_back(el);
el.n=a; el.c=c;
ma[b].push_back(el);
}
}
void rezolvare()
{
ok=(dmin[s]==0); nrg=0;
inc=sf=1;
co[1]=s;
while (inc<=sf)
{
x=co[inc]; inc++;
for (it=ma[x].begin();it!=ma[x].end();it++)
{
if ((dmin[(*it).n]==dmin[x]+(*it).c)&&(!ex[(*it).n]))
{
co[++sf]=(*it).n;
ex[(*it).n]=1;
}
if ((dmin[(*it).n]>dmin[x]+(*it).c)&&(!ex[(*it).n]))
{ ok=0; inc=sf+5; break; }
}
}
if ((ok)&&(sf==n))
printf("DA\n");
else
printf("NU\n");
}
int main()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%ld",&t);
for (ii=1;ii<=t;ii++)
{
citire();
rezolvare();
}
return 0;
}