Pagini recente » Cod sursa (job #459648) | Cod sursa (job #945472) | Istoria paginii preoni-2008/clasament/runda-3/10 | Cod sursa (job #2973839) | Cod sursa (job #1043300)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int N,sol[50005],start,dist[50005],viz[50005];
struct muchie
{
int nod,cost;
};
vector <muchie> L[50005];
queue <int> Q;
inline void Read()
{
int i,x,y,cost,M;
muchie w;
fin>>N>>M>>start;
for(i=1;i<=N;i++)
L[i].clear();
for(i=1;i<=N;i++)
{
fin>>sol[i];
dist[i]=viz[i]=0;
}
for(i=1;i<=M;i++)
{
fin>>x>>y>>cost;
w.nod=x; w.cost=cost;
L[y].push_back(w);
w.nod=y; w.cost=cost;
L[x].push_back(w);
}
}
inline void Bfs()
{
int i,nod,j,len,cost;
viz[start]=1; Q.push(start);
while(!Q.empty())
{
nod=Q.front(); Q.pop();
len=L[nod].size();
for(i=0;i<len;i++)
{
j=L[nod][i].nod; cost=L[nod][i].cost;
if(!viz[j] || dist[j]>dist[nod]+cost)
{
dist[j]=dist[nod]+cost;
viz[j]=1; Q.push(j);
}
}
}
}
inline void Write()
{
int i,ok=1;
for(i=1;i<=N;i++)
if(sol[i]!=dist[i])
ok=0;
if(ok)
fout<<"DA\n";
else
fout<<"NU\n";
}
int main()
{
int T;
fin>>T;
while(T--)
{
Read();
Bfs();
Write();
}
fin.close();
fout.close();
return 0;
}