Pagini recente » Monitorul de evaluare | Cod sursa (job #2023197) | Cod sursa (job #404676) | Cod sursa (job #1128640) | Cod sursa (job #2476598)
#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=2;i<=n;++i)
d[i]=inf;
djk(s);
ok=0;
for (i=1;i<=n;++i)
{
if (d[i]!=oar[i]) ok=1;
}
if (ok==0) out<<"DA";
else out<<"NU";
out<<'\n';
for (i=1;i<=n;++i)
{
sel[i]=0;
while(g[i].size())
g[i].pop_back();
}
}
return 0;
}