Pagini recente » Cod sursa (job #2601324) | Cod sursa (job #1389614) | Cod sursa (job #1479174) | Cod sursa (job #1590759) | Cod sursa (job #694272)
Cod sursa(job #694272)
#include<cstdio>
#include<vector>
#include<bitset>
#include<deque>
#include<cstring>
using namespace std;
bitset<50010> in_q;
vector<pair<int,int> >V[50010];
deque<int> Q;
void read(),solve(),Bellman_Ford();
int T,N,M,A,ok,i,x,y,c,DIST[50010],Z[50010],X;
int main()
{
read();
solve();
return 0;
}
void read()
{
freopen("distante.in","r",stdin);
freopen("distante.out","w",stdout);
scanf("%d",&T);
}
void solve()
{
for(;T;--T)
{
scanf("%d%d%d",&N,&M,&A);
ok=1;
for(i=1;i<=N;i++)
{
scanf("%d",&Z[i]);
V[i].resize(0);
}
for(;M;--M)
{
scanf("%d%d%d",&x,&y,&c);
V[x].push_back(make_pair(y,c));
V[y].push_back(make_pair(x,c));
}
memset(DIST,555,sizeof(DIST));
in_q=0;
DIST[A]=0;
Bellman_Ford();
for(i=1;i<=N;i++)if(Z[i]!=DIST[i]){ok=0;break;}
if(ok)printf("DA\n"); else printf("NU\n");
}
}
void Bellman_Ford()
{
Q.resize(0);
Q.push_back(A);
in_q[A]=1;
for(;!Q.empty();)
{
X=Q.front();
for(vector<pair<int,int> >::iterator it=V[X].begin();it!=V[X].end();it++)
if(DIST[it->first]>DIST[X]+it->second)
{
DIST[it->first]=DIST[X]+it->second;
if(!in_q[it->first])
{
Q.push_back(it->first);
in_q[it->first]=1;
}
}
in_q[X]=0;
Q.pop_front();
}
}