Pagini recente » Cod sursa (job #2331032) | Cod sursa (job #3162134) | Cod sursa (job #2095113) | Cod sursa (job #2487091) | Cod sursa (job #2099893)
#include <cstdio>
#include <set>
#include <vector>
#define pb push_back
#define mkp make_pair
//long long ?
using namespace std;
const int NNOD=50001;
const int INF=100000001;
bool ok;
int ntes,ites,x,y,cost,inod,nnod,imuc,nmuc,sur,add,nodcrt,lgmuc,dnew;
int vdist[NNOD],vcalc[NNOD],veccrt;
vector < pair < int, int > > lst[NNOD];
vector < pair < int, int > >::iterator it;
set < pair < int, int > > squ;
int main()
{
freopen ("distante.in","r",stdin);
freopen ("distante.out","w",stdout);
scanf ("%d",&ntes);
for (ites=1; ites<=ntes; ++ites)
{
scanf ("%d%d%d",&nnod,&nmuc,&sur);
for (inod=1; inod<=nnod; ++inod)
{
scanf("%d",&vcalc[inod]);
}
for (imuc=1; imuc<=nmuc; ++imuc)
{
scanf ("%d%d%d",&x,&y,&cost);
lst[x].pb(mkp(cost,y));
lst[y].pb(mkp(cost,x));
}
for (inod=1; inod<=nnod; ++inod)
{
vdist[inod]=INF;
}
vdist[sur]=0;
squ.insert(mkp(0,sur));
while (!squ.empty())
{
add=squ.begin()->first;
nodcrt=squ.begin()->second;
squ.erase(squ.begin());
for (it=lst[nodcrt].begin();it!=lst[nodcrt].end();++it)
{
veccrt=it->second;
lgmuc=it->first; //if (veccrt==nodcrt) continue;
dnew=add+lgmuc;
if (dnew<vdist[veccrt])
{
if (vdist[veccrt]!=INF)
squ.erase(squ.find(mkp(vdist[veccrt],veccrt)));
squ.insert(mkp(dnew,veccrt));
vdist[veccrt]=dnew;
}
}
}
ok=1;
for (inod=1;inod<=nnod;++inod)
{
if (vcalc[inod]!=vdist[inod])
{
ok=0;break;
}
}
if (ok) printf ("DA");
else printf ("NU");
printf("\n");
for (inod=1;inod<=nnod;++inod)
{
lst[inod].clear();
}
}
return 0;
}