Pagini recente » Cod sursa (job #3192406) | Cod sursa (job #3224986) | Cod sursa (job #1113868) | Cod sursa (job #2726153) | Cod sursa (job #2544946)
#include <bits/stdc++.h>
#define INF 1000000000
#define DIM 50010
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T,n,m,rad,a,b,c,i,ok;
int D[DIM],sol[DIM];
vector < pair<int,int> > L[DIM];
set < pair<int,int> > S;
void initializare(){
for(int i=1;i<=50001;i++){
if(!L[i].empty())
L[i].clear();
}
for(int i=1;i<=n;i++)
D[i]=INF;
D[rad]=0;
ok=1;
}
void dijkstra(){
S.insert({0,rad});
while(!S.empty()){
int nod=S.begin()->second;
S.erase(S.begin());
for(i=0;i<L[nod].size();i++){
int vecin=L[nod][i].first;
int cost=L[nod][i].second;
if(D[vecin] > D[nod]+cost){
S.erase({D[vecin],vecin});
D[vecin]=D[nod]+cost;
S.insert({D[vecin],vecin});
}
}
}
}
int main(){
fin>>T;
while(T--){
fin>>n>>m>>rad;
for(i=1;i<=n;i++)
fin>>sol[i];
initializare();
for(i=1;i<=m;i++){
fin>>a>>b>>c;
L[a].push_back({b,c});
}
dijkstra();
for(i=1;i<=n;i++)
if(D[i]!=sol[i])
ok=0;
if(ok)
fout<<"DA"<<"\n";
else
fout<<"NU"<<"\n";
}
return 0;
}