Pagini recente » Cod sursa (job #2656726) | Cod sursa (job #1822487) | Cod sursa (job #1879399) | Cod sursa (job #2904816) | Cod sursa (job #426310)
Cod sursa(job #426310)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector <pair<int,int> > andreea[50050];
int coada[1000000],d[50050],cost[50050];
bool v[50050],marc[50050];
int n,m,t,s;
void citire()
{
scanf("%d%d%d",&n,&m,&s);
for (int i=1;i<=n;++i)
scanf("%d",&d[i]);
int x,y,c;
while (m--)
{
scanf("%d%d%d",&x,&y,&c);
andreea[x].push_back(make_pair(y,c));
andreea[y].push_back(make_pair(x,c));
}
}
int main()
{
freopen ("distante.in","r",stdin);
freopen ("distante.out","w",stdout);
scanf("%d",&t);
while (t--)
{
citire();
int r=1,p;
coada[1]=s;
memset(v,0,sizeof(v));
memset(marc,0,sizeof(marc));
memset(cost,0,sizeof(cost));
marc[s]=1;
v[s]=1;
for (p=1;p<=r;++p)
{
int nod=coada[p%1000000];
marc[nod]=0;
for (int i=0;i!=andreea[nod].size();++i)
{
if (!v[andreea[nod][i].first]||andreea[nod][i].first!=s&&cost[andreea[nod][i].first]>cost[nod]+andreea[nod][i].second)
{
if (!marc[andreea[nod][i].first])
{
++r;
coada[r%1000000]=andreea[nod][i].first;
}
marc[andreea[nod][i].first]=1;
cost[andreea[nod][i].first]=cost[nod]+andreea[nod][i].second;
v[andreea[nod][i].first]=1;
}
}
}
bool k=1;
for (int i=1;i<=n;++i)
if (cost[i]!=d[i])
k=0;
if (k)
printf("DA\n");
else
printf("NU\n");
if (t)
for (int i=1;i<=n;++i)
andreea[i].clear();
}
return 0;
}