Cod sursa(job #1526268)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 16 noiembrie 2015 08:16:07
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
#include <tuple>

using namespace std;

ifstream in("distante.in");
ofstream out("distante.out");

class comparePair {
public:
    bool operator ()(const pair < int, int > A, const pair < int, int > B) {
        return get<1>(A) > get<1>(B);
    }
};

vector < int > getDistances(const int s, vector < vector < pair < int, int > > > const &G) {
    priority_queue < pair < int, int >, vector < pair < int, int > >, comparePair > Q;
    vector < int > dist(G.size(), 0x7fffffff);
    int u, v, d, c;

    dist[s] = 0;
    Q.push(make_pair(s, 0));
    while(!Q.empty()) {
        u = get<0>(Q.top());
        d = get<1>(Q.top());
        Q.pop();

        if(d == dist[u]) {
            for(auto i : G[u]) {
                v = get<0>(i);
                c = get<1>(i);

                if(dist[v] > d + c) {
                    dist[v] = d + c;
                    Q.push(make_pair(v, d + c));
                }
            }
        }
    }

    return dist;
}

bool testDistances(const int s, vector < vector < pair < int, int > > > const &G, vector < int > const &dist) {
    vector < int > trueDist = getDistances(s, G);
    for(int i = 1; i < G.size(); i++) {
        if(trueDist[i] != dist[i]) {
            return false;
        }
    }
    return true;
}

int main() {
    int t, n, m, u, v, c, i, s;
    vector < vector < pair < int, int > > > G;
    vector < int > dist;

    in >> t;
    while(t--) {
        in >> n >> m >> s;

        G.assign(n + 1, vector < pair < int, int > >(0));
        dist.assign(n + 1, 0);

        for(i = 1; i <= n; i++) {
            in >> dist[i];
        }
        for(i = 1; i <= m; i++) {
            in >> u >> v >> c;
            G[u].push_back(make_pair(v, c));
            G[v].push_back(make_pair(u, c));
        }

        if(testDistances(s, G, dist) == true) out << "DA\n";
        else out << "NU\n";
    }

    return 0;
}