Pagini recente » Cod sursa (job #2386487) | Cod sursa (job #634254) | Cod sursa (job #902860) | Cod sursa (job #313181) | Cod sursa (job #977541)
Cod sursa(job #977541)
#include <fstream>
#include <set>
#include <vector>
#define DIM 50060
#define INF 1000000000
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
int T,n,m,st,D[DIM],A[DIM];
bool viz[DIM];
vector<pair<long long,int> > L[DIM];
set<pair<long long,int> > S;
int main(void){
register int i,j,x,y,c,ok;
pair<long long,int> p,q;
f>>T;
for(;T>0;T--){
f>>n>>m>>st;
for(i=1;i<=n;i++)
f>>A[i],D[i]=INF,viz[i]=false;
D[st]=0;
for(i=1;i<=m;i++){
f>>x>>y>>c;
L[x].push_back(make_pair(c,y));
L[y].push_back(make_pair(c,x));
}
S.insert(make_pair(0,st));
while(!S.empty()){
q=*S.begin();
S.erase(S.begin());
if(viz[q.second])
continue;
for(i=0;i<L[q.second].size();i++){
p=L[q.second][i];
if(!viz[p.second] && D[p.second]>D[q.second]+p.first){
D[p.second]=D[q.second]+p.first;
S.insert(make_pair(D[p.second],p.second));
}
}
viz[q.second]=1;
}
ok=1;
for(i=1;i<=n;i++)
if(A[i]!=D[i]){
g<<"NU\n";
ok=0;
break;
}
if(ok)
g<<"DA\n";
}
return 0;
}