Pagini recente » Cod sursa (job #814847) | Cod sursa (job #1139751) | Cod sursa (job #305401) | Cod sursa (job #1257150) | Cod sursa (job #2476674)
#include <fstream>
#include <vector>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int i,l,k,sel[50100],d[50100],t,x,y,z,j,m,n,s,oar[50100],ok;
vector <pair <int,int > > g[50100];
priority_queue <pair<int,int>,vector <pair<int,int > >,greater <pair<int, int> > > Q;
void djk(int p)
{
for (auto i: g[p])
{
Q.push(i);
d[i.second]=i.first;
}
sel[p]=true;
while (!Q.empty())
{
while (!Q.empty()&&sel[Q.top().second])
Q.pop();
if (!Q.empty())
{
k=Q.top().second;
sel[k]=true;
Q.pop();
for (auto i: g[k])
if (d[i.second]>d[k]+i.first)
{
d[i.second]=d[k]+i.first;
Q.push({d[i.second],i.second});
}
}
}
}
int main()
{
in>>t;
for (j=1; j<=t; ++j)
{
in>>n>>m>>s;
for (i=1; i<=n; ++i)
{
in>>oar[i];
}
for (i=1; i<=m; ++i)
{
in>>x>>y>>z;
g[x].push_back({z,y});
g[y].push_back({z,x});
}
for (i=1; i<=n; ++i)
d[i]=inf;
d[s]=0;
djk(s);
ok=0;
for (i=1; i<=n; ++i)
{
if (d[i]!=oar[i]&&i!=s) ok=1;
}
if (ok==0) out<<"DA";
else out<<"NU";
if (t!=j) out<<'\n';
for (i=1; i<=n; ++i)
{
sel[i]=0;
while(g[i].size())
g[i].pop_back();
}
while (!Q.empty()) Q.pop();
}
return 0;
}