Pagini recente » Cod sursa (job #2741857) | Cod sursa (job #1163174) | Cod sursa (job #2719129) | Cod sursa (job #2714045) | Cod sursa (job #654590)
Cod sursa(job #654590)
#include<stdio.h>
#include<vector>
#include<fstream>
#include<queue>
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
typedef vector<pair<int,int> >::iterator it;
#define MaxN 50010
int T,N,M,S,D[MaxN],viz[MaxN];
vector<pair<int,int> > A[MaxN];
void citire(void)
{
int a,b,c;
f >> N >> M >> S;
for(int i=1;i<=N;i++)
A[i].clear();
for(int i=1;i<=N;i++)
f >> D[i];
for(int i=1;i<=M;i++)
{
f >> a >> b >> c;
A[a].push_back(make_pair(b,c));
A[b].push_back(make_pair(a,c));
}
}
int DistanteCorecte(void)
{
queue<int> Q;
if(D[S]) return 0;
for(int i=1;i<=N;i++)
viz[i] = 0; viz[S] = 1;
for(Q.push(S);!Q.empty();Q.pop())
for(it i=A[Q.front()].begin();i<A[Q.front()].end();i++)
if(D[Q.front()]+i->second < D[i->first])
return 0;
else if(!viz[i->first] && D[Q.front()]+i->second == D[i->first])
viz[i->first] = 1, Q.push(i->first);
for(int i=1;i<=N;i++)
if(!viz[i]) return 0;
return 1;
}
int main()
{
f >> T;
for(int i=1;i<=T;i++)
{
citire();
if(DistanteCorecte())
g << "DA\n";
else
g << "NU\n";
}
return 0;
}