Pagini recente » Cod sursa (job #1991102) | Cod sursa (job #2878774) | Cod sursa (job #2538557) | Cod sursa (job #61505) | Cod sursa (job #2620332)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
const int oo=(1<<31)-1;
int t,n,m,s,dist[100005],sal[100005];
bool viz[100005];
vector<tuple<int, int> >vb[100005];
void dijkstra(int nod){
for(int i=1;i<=n;i++){
dist=oo;
viz[i]=0;
}
dist[nod]=0;
priority_quene<tuple <int ,int > > pq[100005];
pq.push({0,nod});
while(!pq.empty()){
int k=pq.top();
pq.pop();
if(viz[k]) continue;
for( auto&it : vb[k]){
int b,w;
tie(b,w)=it;
if(dist[k]+ w <dist[b]){
dist[b]=dist[k]+ w;
pq.push({-dist[b],b});
}
}
viz[k]=1;
}
}
int main(){
in >>t;
while(t--){
in >>n>>m>>s;
for(int i=1;i<=n;i++)in >>sal[i];
for(int i=1;i<=m;i++){
int a,b,c;
in>>a>>b>>c;
vb[a].push_back({b,c});
vb[b].push_back({a,c});
}
dijkstra(s);
bool da=1;
for(int i=1;i<=n;i++){
if(sal[i] != dist[i]){
out <<"NU\n";
da=0;
break;
}
}
if(da)cout <<"DA\n";
for(int i=1;i<=n;i++)vb[i].clear();
}
}