Pagini recente » Cod sursa (job #1214351) | Cod sursa (job #1090589) | Cod sursa (job #383218) | Cod sursa (job #780438) | Cod sursa (job #743804)
Cod sursa(job #743804)
#include<fstream>
#include<algorithm>
#include<utility>
#include<vector>
#define INF 0x3f3f3f3f
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define NN 50001
using namespace std;
ofstream out("distante.out");
ifstream in("distante.in");
vector<pair<int,int> >G[NN];
int n,m,s,d[NN],v[NN],d2[NN];
void read();
void solve();
void dijkstra(int );
int main()
{
int t;
in>>t;
for(;t;--t)
{
read();
dijkstra(s);
solve();
}
return 0;
}
void read()
{
in>>n>>m>>s;
for(int ii=1;ii<=n;ii++)
in>>d2[ii];
int i,j,c;
for(;m;--m)
{
in>>i>>j>>c;
G[i].pb(mp(j,c));
G[j].pb(mp(i,c));
}
}
void dijkstra(int start)
{
memset(d,INF,sizeof(d));
memset(v,0,sizeof(v));
int i,j,k,poz;
for(i=0;i<G[start].size();++i)
d[G[start][i].f]=G[start][i].s;
for(i=1;i<n;i++)
{
int minim=INF;
for(j=1;j<=n;j++)
if(d[j]<minim&&!v[j])
{
minim=d[j];
poz=j;
}
v[poz]=1;
for(k=0;k<G[poz].size();++k)
if(d[G[poz][k].f]>d[poz]+G[poz][k].s)
d[G[poz][k].f]=d[poz]+G[poz][k].s;
}
}
void solve()
{
int pp=1;
d[s]=0;
for(int i=1;i<=n;i++)
if(d[i]!=d2[i])
{
pp=0;
break;
}
if(pp)
out<<"DA"<<'\n';
else
out<<"NU"<<'\n';
}