Pagini recente » Cod sursa (job #580076) | Cod sursa (job #2022057) | Cod sursa (job #189953) | Cod sursa (job #2220656) | Cod sursa (job #2037866)
#include<fstream>
#include<vector>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
int poz[50001],sol[50001],d[50001],hz[50001];
struct str{
int nod,val;
}heap[50001];
vector<pair<int,int> >v[50001];
int sz,n,m,s,knot,val,vec,cost,a,b,c,ok;
void up (int p) {
while (p > 1 && heap[p].val < heap[p/2].val) {
swap (heap[p], heap[p/2]);
swap (poz[heap[p].nod], poz[heap[p/2].nod]);
p /= 2;
}
return;
}
void down (int p) {
while (p*2 <= sz) {
int t = p * 2;
if (t < sz && heap[t+1].val < heap[t].val) {
t++;
}
if (heap[t].val < heap[p].val) {
swap (heap[p], heap[t]);
swap(poz[heap[p].nod], poz[heap[t].nod]);
p = t;
}
else{
break;
}
}
return;
}
void elimina() {
hz[heap[1].nod] = 0;
swap(heap[1], heap[sz]);
swap(poz[heap[1].nod], poz[heap[sz].nod]);
sz --;
}
int t;
int main(){
in >> t;
for (int h = 1; h <= t; h ++) {
in >> n >> m >> s;
for (int i = 1; i <= n; i ++) {
in >> sol[i];
}
for (int i = 1; i <= m; i ++) {
in >> a >> b >> c;
v[a].push_back( make_pair(b,c) );
v[b].push_back( make_pair(a,c) );
}
heap[1].nod = s;
heap[1].val = 0;
poz[s] = 1;
sz = 1;
for (int i = 1; i <= n; i ++) {
hz[i] = 1;
if ( i == s ){
continue;
}
sz++;
heap[sz].nod = i;
heap[sz].val = 1e9;
poz[i] = sz;
}
for (int i = 1; i <= n; i ++) {
knot = heap[1].nod;
val = heap[1].val;
d[knot] = val;
elimina();
for (int j = 0; j < v[knot].size(); j ++) {
vec = v[knot][j].first;
cost = v[knot][j].second;
if (hz[vec] == 1){
heap[ poz[vec] ].val = min( heap[ poz[vec] ].val, val + cost );
up( poz[vec] ); down( poz[vec] );
}
}
}
ok = 1;
for (int i = 1; i <= n; i ++) {
if (sol[i] != d[i]) {
ok = 0;
break;
}
}
for (int i = 1; i <= n; i ++) {
v[i].clear();
}
if (ok == 1) {
out<<"DA"<<"\n";
}
else {
out<<"NU"<<"\n";
}
}
return 0;
}