Pagini recente » Cod sursa (job #843692) | Cod sursa (job #336873) | Cod sursa (job #567701) | Cod sursa (job #1448797) | Cod sursa (job #977305)
Cod sursa(job #977305)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define In "distante.in"
#define Out "distante.out"
#define _node first
#define cost second
#define PII pair<int,int>
#define Inf 0x3f3f3f3f
#define Nmax 50002
using namespace std;
struct cmp
{
bool operator ()(const PII A,const PII B) const
{
return A.cost > B. cost;
}
};
ifstream in(In);
ofstream out(Out);
vector< PII >Graph[Nmax];
int D[Nmax], Dist[Nmax],N, Source;
inline void Read()
{
int X, Y, C, i, M;
in>>N>>M>>Source;
for(i = 1; i <= N; ++i)
in>>D[i];
for(; M ; --M)
{
in>>X>>Y>>C;
Graph[X].push_back(make_pair(Y,C));
Graph[Y].push_back(make_pair(X,C));
}
}
inline void Solve()
{
priority_queue< PII ,vector < PII > ,cmp > Q;
Q.push(make_pair(Source,0));
memset(Dist,Inf,sizeof(Dist));
Dist[Source] = 0;
PII curent;
vector< PII > :: iterator it;
while(!Q.empty())
{
curent = Q.top();
Q.pop();
if(Dist[curent._node]<curent.cost)
continue;
for(it = Graph[curent._node].begin();it!=Graph[curent._node].end();++it)
{
if(Dist[(*it)._node]>curent.cost+(*it).cost)
{
Dist[(*it)._node] = curent.cost+(*it).cost;
Q.push(make_pair((*it)._node,Dist[(*it)._node]));
}
}
}
}
inline void Write()
{
int i,ok = 1;
for(i=1;i<=N;++i)
{
if(D[i]!=Dist[i])
ok = 0;
Graph[i].clear();
}
if(!ok)
out<<"NU\n";
else
out<<"DA\n";
}
int main()
{
int T;
for(in>>T; T ; --T)
{
Read();
Solve();
Write();
}
in.close();
out.close();
return 0;
}