Cod sursa(job #2038027)

Utilizator osiaccrCristian Osiac osiaccr Data 13 octombrie 2017 09:14:35
Problema Distante Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <vector>
#include <set>
#define DEF 50001
#define INF 200001

using namespace std;

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

int t, n, m, s, d[DEF], sol[DEF], viz[DEF];

set < pair < int, int > > S;

vector < pair < int, int > > L[DEF];

void afis () {
    for (int i = 1; i <= n; i++) {
        if (d[i] != sol[i]) {
            fout << "NU\n";
            return;
        }
    }
    fout << "DA\n";
}

int main () {
    fin >> t;
    for (;t > 0; t--) {
        fin >> n >> m >> s;
        for (int i = 1; i <= n; i++) {
            fin >> sol[i];
            viz[i] = 0;
            d[i] = INF;
            L[i].clear ();
        }
        for (int i = 1; i <= m; i++) {
            int x, y, c;
            fin >> x >> y >> c;
            L[x].push_back (make_pair (y, c));
            L[y].push_back (make_pair (x, c));
        }
        d[s] = 0;
        S.insert (make_pair (0, s));
        while (!S.empty ()) {
            int nod = S.begin () -> second;
            S.erase (S.begin ());
            viz[nod] = 1;
            for (vector < pair < int, int > >::iterator it = L[nod].begin (); it != L[nod].end(); it++) {
                int vecin = it -> first;
                int cost = it -> second;
                if (d[vecin] > d[nod] + cost && viz[vecin] == 0) {
                    if (d[vecin] != INF)
                        S.erase (S.find (make_pair (d[vecin], vecin)));
                    d[vecin] = d[nod] + cost;
                    S.insert (make_pair (d[vecin], vecin));

                }
            }
        }
        afis ();
        S.clear ();
    }
    return 0;
}