Pagini recente » Cod sursa (job #1467379) | Cod sursa (job #585627) | Cod sursa (job #677121) | Cod sursa (job #303887) | Cod sursa (job #2654614)
#include <fstream>
#include <vector>
#include <set>
#define x first
#define y second
#define inf 2000000
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,i,j,d[50001],q[50001],src,x,y,cost,nod,vec;
vector <pair <int,int> > l[50001];
set <pair<int,int> > s;
int main(){
for(fin>>t; t; t--){
s.clear();
fin>>n>>m>>src;
for(i=1;i<=n;i++){
fin>>q[i];
d[i]=inf;
while(!l[i].empty())
l[i].pop_back();
}
d[src]=0;
for(i=1;i<=m;i++){
fin>>x>>y>>cost;
l[x].push_back({y,cost});
l[y].push_back({x,cost});
}
s.insert(make_pair(0,src));
while(!s.empty()){
nod=s.begin()->y;
s.erase(s.begin());
for(i=0;i<l[nod].size();i++){
vec=l[nod][i].x;
cost=l[nod][i].y;
if(d[vec]>d[nod]+cost){
s.erase({d[vec],vec});
d[vec]=d[nod]+cost;
s.insert({d[vec],vec});
}
}
}
for(i=1;i<=n;i++)
if(q[i]!=d[i])
break;
if(i<=n)
fout<<"NU\n";
else
fout<<"DA\n";
}
return 0;
}