Pagini recente » Cod sursa (job #2421980) | Monitorul de evaluare | Cod sursa (job #685530) | Cod sursa (job #2604148) | Cod sursa (job #2170137)
#include <iostream>
#include <fstream>
#include <queue>
#define oo (1<<30)
#define Nmax 50009
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
int n,m,t,s,d1[Nmax],d[Nmax],v[Nmax];
vector <pair<int,int> > G[Nmax];
struct compara
{
bool operator () (int a,int b)
{
return d[a]>d[b];
}
};
priority_queue <int,vector<int>,compara> q;
void DJK (int nod)
{
int i,x,vec,dist;
for (i=1;i<=n;i++)
{
d[i]=oo;
v[i]=0;
}
d[nod]=0;
v[nod]=1;
q.push(nod);
while (!q.empty())
{
x=q.top();
q.pop();
v[x]=0;
for (size_t i=0;i<G[x].size();i++)
{
vec=G[x][i].first;
dist=G[x][i].second;
if (d[x]+dist<d[vec])
{
d[vec]=d[x]+dist;
if (v[vec]==0)
{
v[vec]=1;
q.push(vec);
}
}
}
}
}
int main()
{
int h,ok,i,x,y,z;
fin>>t;
for (h=1;h<=t;h++)
{
fin>>n>>m>>s;
for (i=1;i<=n;i++)
{
fin>>d1[i];
G[i].clear();
}
for (i=1;i<=m;i++)
{
fin>>x>>y>>z;
G[x].push_back(make_pair(y,z));
G[y].push_back(make_pair(x,z));
}
DJK(s);
ok=1;
for (i=1;i<=n&&ok;i++)
if (d[i]!=d1[i])
ok=0;
if (ok)
fout<<"DA";
else
fout<<"NU";
fout<<"\n";
}
fin.close();
fout.close();
return 0;
}