Pagini recente » Cod sursa (job #1273099) | Cod sursa (job #616605) | Cod sursa (job #805497) | Cod sursa (job #2525611) | Cod sursa (job #2819374)
#include <bits/stdc++.h>
#define inf 2e9
#define NMAX 50001
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int n,m,sol[NMAX],d[NMAX];
bool vis[NMAX];
vector<pair<int,int> > v[NMAX];
priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > h; // min-heap
int main()
{
int i,t,start,x,y,cost,node,next;
fin>>t;
for(;t;t--)
{
fin>>n>>m>>start;
for(i=1;i<=n;i++)
fin>>sol[i];
for(i=1;i<=m;i++)
{
fin>>x>>y>>cost;
v[x].push_back({cost,y});
v[y].push_back({cost,x});
}
for(i=1;i<=n;i++)
d[i]=inf;
d[start]=0;
h.push({0,start});
while(!h.empty())
{
node=h.top().second;
h.pop();
if(!vis[node])
{
for(i=0;i<v[node].size();i++)
{
cost=v[node][i].first;
next=v[node][i].second;
if(d[node]+cost<d[next])
{
d[next]=d[node]+cost;
h.push({d[next],next});
}
}
}
vis[node]=1;
}
bool ok=1;
for(i=1;i<=n;i++)
{
if(sol[i]!=d[i])
ok=0;
d[i]=inf;
v[i].clear();
}
if(ok)fout<<"DA\n";
else fout<<"NU\n";
memset(vis,0,sizeof(vis));
}
}