Pagini recente » Cod sursa (job #1798227) | Cod sursa (job #2155916) | Cod sursa (job #1537454) | Cod sursa (job #2626103) | Cod sursa (job #2654606)
#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;
vector <pair <int,int> > l[50001];
set <pair<int,int> > s;
pair<int,int> nod, vec;
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(make_pair(y,cost));
l[y].push_back(make_pair(x,cost));
}
s.insert(make_pair(0,src));
while(!s.empty()){
nod=make_pair(s.begin()->x,s.begin()->y);
s.erase(s.begin());
for(i=0;i<l[nod.y].size();i++){
vec=l[nod.y][i];
if(d[vec.x]>nod.x+vec.y){
s.erase(make_pair(d[vec.x],vec.x));
d[vec.x]=nod.x+vec.y;
s.insert(make_pair(d[vec.x],vec.x));
}
}
}
for(i=1;i<=n;i++)
if(q[i]!=d[i])
break;
if(i<=n)
fout<<"NU\n";
else
fout<<"DA\n";
}
return 0;
}