Pagini recente » Cod sursa (job #1638384) | Cod sursa (job #2647227) | Cod sursa (job #3003195) | Cod sursa (job #1718816) | Cod sursa (job #1113709)
#include <fstream>
#include <vector>
#include <queue>
#define pb push_back
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
#define NMAX 50005
#define INF 99999999
vector <int> v[NMAX],cost[NMAX];
queue <int> q;
int n,m,a,b,s;
int d[NMAX],sol[NMAX];
bool viz[NMAX],ever[NMAX];
void reset()
{
for(int i=1;i<=n;i++)
{
d[i]=INF;
v[i].clear();
cost[i].clear();
viz[i] = ever[i] = false;
}
}
int minim(int a,int b)
{
if(a<b) return a;
return b;
}
void solve()
{
int a,b,c,nod;
fin>>n>>m>>s;
if(d[1] == 0) for(int i=1;i<=n;i++) d[i] = INF; //init
d[s] = 0;
for(int i=1;i<=n;i++)
fin>>sol[i];
for(int i=1;i<=m;i++)
{
fin>>a>>b>>c;
v[a].pb(b);
v[b].pb(a);
cost[b].pb(c);
cost[a].pb(c);
}
q.push(s);
int y;
while(!q.empty())
{
nod = q.front();
ever[nod] = true;
q.pop();
for(int i=0;i<v[nod].size();i++)
{
y = v[nod][i];
if(ever[y] == false || d[y] > d[nod] + cost[nod][i])
{
if(viz[y] == false)
q.push(y);
ever[y] = true;
viz[y] = true;
d[y] = d[nod] + cost[nod][i];
if(d[y] < sol[y]) { fout<<"NU\n"; return;}
}
}
viz[nod] = false;
}
// for(int i=1;i<=n;i++) fout<<d[i]<<" ";fout<<endl; //test
for(int i=1;i<=n;i++)
if(d[i] != sol[i]) { fout<<"NU\n"; return;}
fout<<"DA\n";}
int main()
{
int t;
fin>>t;
solve();
for(int i=1;i<t;i++)
{
reset();
solve();
}
}