Cod sursa(job #2037866)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 12 octombrie 2017 21:35:13
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#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;
}