Pagini recente » Cod sursa (job #2044224) | Cod sursa (job #1255265) | Cod sursa (job #2046965) | Cod sursa (job #2105495) | Cod sursa (job #2841433)
#include <bits/stdc++.h>
#define nmax 50005
using namespace std;
string prob="distante";
ifstream in(prob+".in");
ofstream out(prob+".out");
int distver[nmax];
int dist[nmax];
vector<pair<int,int>> adj[nmax];
bool dij(int nod){
set<pair<int,int>> s;
s.insert({0,nod});
while(!s.empty())
{
int n=s.begin()->second;
s.erase(s.begin());
if(dist[n]!=distver[n])return 0;
for(auto p:adj[n])
{
int i=p.first;
int j=p.second;
if(dist[i]!=distver[i])
{
if(dist[i]!=INT_MAX)s.erase(s.find({dist[i],i}));
dist[i]=dist[n]+j;
s.insert({dist[i],i});
}
}
}
return 1;
}
void solve()
{
int n,m,s;
in>>n>>m>>s;
for(int i=1;i<=n;i++)
{
dist[i]=INT_MAX;
distver[i]=0;
adj[i].clear();
}
for(int i=1;i<=n;i++)in>>distver[i];
for(int i=0;i<m;i++)
{
int x,y,z;
in>>x>>y>>z;
adj[x].push_back({y,z});
adj[y].push_back({x,z});
}
dist[s]=0;
if(dij(s))
{
out<<"DA\n";
}
else
{
out<<"NU\n";
}
}
int main()
{
int t;
in>>t;
while(t--)solve();
}