Pagini recente » Cod sursa (job #724040) | Cod sursa (job #2262212) | Cod sursa (job #2006365) | Cod sursa (job #2755876) | Cod sursa (job #2275835)
#include <bits/stdc++.h>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int mini[50002],verif[50002];
vector <pair <int,int> > v[50001];
priority_queue <pair <int,int> ,vector <pair <int,int> > ,greater <pair <int,int> > > h;
int t,n,m,inceput,i,j,x,y,cost,nod,sel[50005],c,ok1,nr;
int main()
{
f>>t;
for (int yyi=1;yyi<=t;yyi++)
{
f>>n>>m>>inceput;
for (j=1;j<=n;j++)
{
f>>verif[j];
}
for (i=1;i<=m;i++)
{
f>>x>>y>>cost;
v[x].push_back({y,cost});
v[y].push_back({x,cost});
}
for (j=1;j<=n;j++)
{
mini[j]=-1;
}
mini[inceput]=0;
nr=0;
for (i=0;i<v[inceput].size();i++)
{
nod=v[inceput][i].first;
mini[nod]=v[inceput][i].second;
h.push({v[inceput][i].second,nod});
}
sel[inceput]=1;
nr=v[inceput].size();
while (nr)
{
while (sel[h.top().second]==1)
{
h.pop();
}
c=h.top().second;
h.pop();
sel[c]=1;
nr--;
for (i=0;i<v[c].size();i++)
{
j=v[c][i].first;
if (mini[j]==-1)
{
nr++;
mini[j]=mini[c]+v[c][i].second;
h.push({mini[j],j});
}
else
if (mini[j]>mini[c]+v[c][i].second)
{
mini[j]=mini[c]+v[c][i].second;
h.push(make_pair(mini[j],j));
}
}
}
ok1=1;
for (i=1;i<=n;i++)
{
if (mini[i]!=verif[i])
{
ok1=0;
break;
}
}
for (i=1;i<=n;i++){sel[i]=0;mini[i]=-1;}
while (!h.empty())h.pop();
for (i=1;i<=n;i++)
{
while (!v[i].empty())
{
v[i].pop_back();
}
}
if (ok1==0)
{
g<<"NU"<<'\n';
}
else
{
g<<"DA"<<'\n';
}
}
return 0;
}