Cod sursa(job #847479)

Utilizator silviuboganSilviu Bogan silviubogan Data 4 ianuarie 2013 00:02:34
Problema Distante Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <vector>
#include <queue>
#include <limits>
using namespace std;

int main () {
    int n, m, nr, i, s, t, a, b, c;
    const int inf = numeric_limits<int>::max();
    vector<pair<int, int> >::iterator it, eit;
    bool corect;

    ifstream in("distante.in");
    ofstream out("distante.out");
    in >> nr;
    for (i = 0; i < nr; i++) {
        in >> n >> m >> s;
        vector<pair<int, int> > g[n + 1];
        vector<bool> viz(n + 1, false);
        viz[s] = true;
        vector<int> dist(n + 1, inf);
        vector<int> distc(n + 1);
        dist[s] = 0;
        queue<int> q;
        q.push(s);

        for (t = 1; t <= n; t++) {
            in >> distc[t];
        }
        for (t = 0; t < m; t++) {
            in >> a >> b >> c;
            g[a].push_back(make_pair(b, c));
            g[b].push_back(make_pair(a, c));
        }
        while (!q.empty()) {
            t = q.front();
            q.pop();
            viz[t] = false;
            for (it = g[t].begin(), eit = g[t].end(); it != eit; ++it) {
                if (dist[t] + it->second < dist[it->first]) {
                    dist[it->first] = dist[t] + it->second;
                    if (!viz[it->first]) {
                        viz[it->first] = true;
                        q.push(it->first);
                    }
                }
            }
        }
        corect = true;
        for (t = 1; t <= n; t++) {
            if (dist[t] != distc[t]) {
                corect = false;
                break;
            }
        }
        out << (corect ? "DA" : "NU") << '\n';
    }
    in.close();
    out.close();

    return 0;
}