Pagini recente » Cod sursa (job #439766) | Cod sursa (job #2496366) | Cod sursa (job #2003124) | Profil M@2Te4i | Cod sursa (job #2495183)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
priority_queue <pair <int,int> > pq;
bool ok[50001];
int ans[50001],cica[50001];
vector < pair <int,int> > v[50001];
ifstream in ("distante.in");
ofstream out ("distante.out");
void dijkstra (int s)
{
pq=priority_queue <pair <int,int> >();
pair <int,int> p;
pq.push({0,s});
while (!pq.empty())
{
p=pq.top();
pq.pop();
swap(p.first,p.second);
p.second=-p.second;
if (ans[p.first]<p.second&&ok[p.first])
continue;
int nod,dist;
for (int i=0;i<v[p.first].size();++i)
{
nod=v[p.first][i].second;
dist=v[p.first][i].first;
if (ok[nod]&&ans[nod]<=dist+p.second)
continue;
ok[nod]=1;
ans[nod]=dist+p.second;
pq.push({-dist-p.second,nod});
}
}
for (int i=1;i<=50000;i++)
v[i].clear();
}
int main()
{
int t,n,m,s,a,b,c;
in>>t;
for (int i=1;i<=t;++i)
{
in>>n>>m>>s;
for (int j=1;j<=n;j++)
ans[j]=0,ok[j]=0;
for (int j=1;j<=n;j++)
in>>cica[j];
for (int j=1;j<=m;j++)
{
in>>a>>b>>c;
v[a].push_back({c,b});
v[b].push_back({c,a});
}
dijkstra(s);
ans[s]=0;
bool ok=0;
for (int j=1;j<=n&&ok==0;j++)
if (ans[j]!=cica[j])
ok=1;
if (ok)
out<<"NU"<<'\n';
else
out<<"DA"<<'\n';
}
return 0;
}