Pagini recente » Cod sursa (job #92833) | Cod sursa (job #1468718) | Cod sursa (job #825049) | Cod sursa (job #1904550) | Cod sursa (job #1334697)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
#define nmax 50010
#define inf 2000000010
#define mp make_pair
#define pb push_back
int t,n,m,s,dMin[nmax],d[nmax],x,y,c,ok;
vector<pair<int,int> > g[nmax];
queue<int> q;
bitset<nmax> v;
void bf(int sursa)
{
int i,j,x,nod,cost;
vector<pair<int,int> >::iterator it;
for (i=1;i<=n;i++)
d[i]=inf;
d[sursa]=0;
v.set(sursa);
q.push(sursa);
while (!q.empty())
{
x=q.front();
q.pop();
v.reset(x);
for (it=g[x].begin();it!=g[x].end();it++)
{
nod=(*it).first;
cost=(*it).second;
if (d[nod]>d[x]+cost)
{
d[nod]=d[x]+cost;
if (v.test(nod)==false)
{
v.set(nod);
q.push(nod);
}
}
}
}
}
int main()
{
int i,j;
cin>>t;
for (;t;t--)
{
cin>>n>>m>>s;
for (i=1;i<=n;i++)
cin>>dMin[i];
for (i=1;i<=m;i++)
{
cin>>x>>y>>c;
g[x].pb(mp(y,c));
g[y].pb(mp(x,c));
}
bf(s);
ok=1;
for (i=1;i<=n;i++)
if (dMin[i]!=d[i])
{
ok=0;
break;
}
if (ok) cout<<"DA"<<'\n';
else cout<<"NU"<<'\n';
if (t>1)
{
for (i=1;i<=n;i++)
g[x].clear();
v.reset();
}
}
}