Cod sursa(job #1711590)

Utilizator Tomi98Osvath Tamas Tomi98 Data 31 mai 2016 18:59:17
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <deque>
#include <vector>
#define INF 1<<30

using namespace std;

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

struct nod{
    int vecin, cost;
}c;

vector <nod > v[50010];
deque <int > C;

int costMin[50010], n, m, s, d[50010], t, node, new_node;

void bfs(int n){
    node = n;
    C.push_back(node);
    while (!C.empty()){
        node = C.front();
        C.pop_front();
        for (int i = 0; i < int(v[node].size()); i++){
            new_node = v[node][i].vecin;
            if (costMin[new_node] > costMin[node] + v[node][i].cost){
                costMin[new_node] = costMin[node] + v[node][i].cost;
                C.push_back(new_node);
            }
        }
    }
}
int main()
{
    fin >> t;
    for (int k = 1; k <= t; k++){
        C.clear();
        bool ok = 0;
        fin >> n >> m >> s;
        for (int i = 1; i <= n; i++)
            v[i].clear();
        for (int i = 1; i <= n; i++)
            fin >> d[i];
        for (int i = 1; i <= m; i++){
            int a, b;
            fin >> a >> b >> c.cost;
            c.vecin = b;
            v[a].push_back(c);
        }
        for (int i = 1; i <= n; i++)
            costMin[i] = INF;
        costMin[s] = 0;
        bfs(s);
        for (int i = 1; i <= n; i++)
            if (d[i] != costMin[i]){
                ok = 1; break;
            }
        if (ok == 0) fout << "DA" << '\n';
            else fout << "NU" << '\n';
    }
    return 0;
}