Cod sursa(job #2129494)

Utilizator tudortarniceruTudor Tarniceru tudortarniceru Data 12 februarie 2018 21:06:14
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;

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

const int MAXN = 50005;
int teste;

int main() {

    fin >> teste;
    for (int test = 1; test <= teste; ++test) {
        int n, m, c;
        fin >> n >> m >> c;
        int a[MAXN], s[MAXN];
        for (int i = 1; i <= n; ++i) {
            fin >> a[i];
            s[i] = 0;
        }
        vector< pair<int, int> > v[MAXN];
        for (int i = 1; i <= m; ++i) {
            int a, b, c;
            fin >> a >> b >> c;
            v[a].push_back(make_pair(b, c));
            v[b].push_back(make_pair(a, c));
        }

        queue<int> q;
        q.push(c);

        while(!q.empty()) {
            int k = q.front();
            for (int i = 0; i < v[k].size(); ++i) {
                pair<int, int> p = v[k][i];
                if (s[p.first] == 0 || s[p.first] > s[k] + p.second) {
                    s[p.first] = s[k] + p.second;
                    q.push(p.first);
                }
            }
            q.pop();
        }

        s[c] = 0;
        string ok = "DA";
        for (int i = 1; i <= n; ++i) {
            if (s[i] != a[i]) {
                ok = "NU";
                i = n + 10;
            }
        }
        fout << ok << '\n';
    }

    fout.close();
    return 0;
}