Pagini recente » Cod sursa (job #853915) | Cod sursa (job #1651934) | Cod sursa (job #801489) | Cod sursa (job #657267) | Cod sursa (job #2796998)
#include <bits/stdc++.h>
#define PAIR pair<int, int>
#define newl fout<<"\n";
using namespace std;
ifstream fin ("distante.in");
ofstream fout ("distante.out");
const string msj[] = {"NU", "DA"};
const int INF = (1 << 30);
const int DIM = 50005;
int test[DIM], way[DIM];
vector <PAIR> v[DIM];
int n, m, s, x, y, c;
bitset <DIM> was_in_q;
priority_queue <PAIR> q;
void dijkstra(int start){
for(int i=1; i<=n; i++){
way[i] = INF;
was_in_q[i] = false;
}
int nod, nxt, cst;
way[start] = 0;
q.push({0, start});
while(!q.empty()){
nod = q.top().second;
q.pop();
if(was_in_q[nod] == false)
for(int i=0; i<v[nod].size(); i++){
nxt = v[nod][i].first;
cst = v[nod][i].second;
if(way[nxt] > way[nod] + cst){
way[nxt] = way[nod] + cst;
q.push({-way[nxt], nxt});
}
}
was_in_q[nod] = true;
}
}
int main (){
int teste; fin>>teste;
while(teste--){
fin>>n>>m>>s;
for(int i=1; i<=n; i++)
fin>>test[i];
for(int i=1; i<=m; i++){
fin>>x>>y>>c;
v[x].push_back({y, c});
v[y].push_back({x, c});
}
dijkstra(s);
bool ok = true;
for(int i=1; i<=n; i++){
if(way[i] != test[i])
ok=false;
v[i].clear();
}
fout<<msj[ok]; newl
}
return 0;
}