Cod sursa(job #1886977)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 21 februarie 2017 11:52:26
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <cassert>
using namespace std;

#define INF 0x7FFFFFFF
#define MAX_NODES 50050

struct MyPair{
    int key, val;
};

set<pair<int,int> > h;
vector<MyPair> g[MAX_NODES];
int t,n,m,s,a,b,c, d[MAX_NODES];

class Dijkstra {
public:
    Dijkstra(int n) : n(n) {
        d.resize(n + 1);
    }

    void dist(int s) {
        for (int i = 1; i <= n; ++i) d[i] = INF;
        d[s] = 0;
        h.insert({0, s});
        while (h.size() > 0) {
            pair<int,int> t = *h.begin();
            int x = t.second, cost, y;
            h.erase(h.begin());
            for (int i = 0; i < g[x].size(); ++i) {
                y = g[x][i].key;
                cost = g[x][i].val;
                if (d[y] != INF) {
                    h.erase(make_pair(d[y], y));
                }
                if (d[y] > d[x] + cost) {
                    d[y] = d[x] + cost;
                    h.insert(make_pair(d[y], y));
                }
            }
        }
    }

    bool same(int *orig) {
//        for (int i = 1; i <= n; ++i) {
//            cout << d[i] << " ";
//            if (d[i] == INF) {
//                d[i] = 0;
//            }
//        }
//        cout << endl;
        for (int i = 1; i <= n; ++i) {
            if (d[i] != orig[i]) {
                return false;
            }
        }
        return true;
    }

private:
    int n;
    vector<int> d;
};

int main() {

//    Heap h(4);
//    h.push(1, 10);
//    h.push(2, 20);
//    h.push(3, -5);
//    h.push(3, -100);
//    cout << h.top().val << endl;
//    h.pop();
//    cout << h.top().val << endl;
//    h.pop();
//    cout << h.top().val << endl;

    freopen("distante.in","r",stdin);
    freopen("distante.out", "w", stdout);
    scanf("%d", &t);
    while (t--) {
        scanf("%d %d %d", &n, &m, &s);
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &d[i]);
        }
        memset(g, 0, sizeof(g));
        for (int i = 0; i < m; ++i) {
            scanf("%d %d %d", &a, &b, &c);
            g[a].push_back({b, c});
        }
        Dijkstra dij(n);
        dij.dist(s);
        if (dij.same(d)) {
            cout << "DA" << endl;
        } else {
            cout << "NU" << endl;
        }
    }


    return 0;
}