Pagini recente » Cod sursa (job #1674992) | Cod sursa (job #506870) | Cod sursa (job #2978321) | Cod sursa (job #1854890) | Cod sursa (job #1937352)
#include <fstream>
#include <vector>
#include <set>
#define nmax 50005
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
set <pair <int,int> > p;
vector <pair <int,int > > v[nmax];
int n,m,s,e[nmax],d[nmax];
int solvetest()
{
int i,j,a,b,c;
f>>n>>m>>s;
for (i=1;i<=n;i++) {
v[i].clear();
f>>e[i];
d[i]=1<<30;
}
for (i=1;i<=m;i++) {
f>>a>>b>>c;
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
d[s]=0;
p.insert(make_pair(0,s));
while (!p.empty()) {
a=p.begin()->second;
p.erase(p.begin());
if (d[a]<e[a])
return 0;
for (i=0;i<v[a].size();i++) {
b=v[a][i].first;
c=v[a][i].second;
if (d[b]>d[a]+c) {
if (p.find(make_pair(d[b],b))!=p.end())
p.erase(p.find(make_pair(d[b],b)));
d[b]=d[a]+c;
p.insert(make_pair(d[b],b));
}
}
}
for (i=1;i<=n;i++)
if (d[i]!=e[i])
return 0;
return 1;
}
int main()
{
int t;
for (f>>t;t;t--)
(solvetest()==1)?g<<"DA\n":g<<"NU\n";
return 0;
}