Pagini recente » Cod sursa (job #2213940) | Cod sursa (job #2774891) | Cod sursa (job #473818) | Cod sursa (job #1310484) | Cod sursa (job #2971145)
#include <fstream>
#include <set>
#include <climits>
#include <vector>
#define inf LLONG_MAX
#include <utility>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
struct muchie{
int x, c;
};
long long d[50001], sol[50001];
set <pair<long long, int>>s;
vector <muchie> l[50001];
int main()
{
int t, m, n, xs, i, j, cost, nod, x, y, c, vecin;
fin>>t;
while(t)
{
t--;
fin>>n>>m>>xs;
for(i=1;i<=n;i++)
{
fin>>sol[i];
}
for(i=1;i<=m;i++)
{
fin>>x>>y>>c;
l[x].push_back({y, c});
l[y].push_back({x, c});
}
for(i=1;i<=n;i++)
{
d[i]=inf;
}
d[xs]=0;
s.insert(make_pair(0, xs));
while(s.empty()==0)
{
nod=s.begin()->second;
s.erase(s.begin());
for(i=0;i<l[nod].size();i++)
{
vecin=l[nod][i].x;
cost=l[nod][i].c;
if(d[vecin]>d[nod]+cost)
{
s.erase(make_pair(d[vecin], vecin));
d[vecin]=d[nod]+cost;
s.insert(make_pair(d[vecin], vecin));
}
}
}
s.clear();
for(i=1;i<=n;i++)
{
l[i].clear();
}
int ok=1;
for(i=1;i<=n;i++)
{
if(sol[i]!=d[i])
{
ok=0;
break;
}
}
if(ok==1)
{
fout<<"DA"<<"\n";
}
else
{
fout<<"NU"<<"\n";
}
}
}