Cod sursa(job #1527800)

Utilizator serbanSlincu Serban serban Data 18 noiembrie 2015 19:16:37
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;

vector< pair<int, int> > L[50005];
bool viz[50005];
int d[50005];
int D[50005];

priority_queue< pair<int, int> > q;

int main()
{
    ifstream f("distante.in");
    ofstream g("distante.out");

    int t;
    f >> t;
    while(t) {
        int n, m, s, a, b, c;
        f >> n >> m >> s;
        for(int i = 1; i <= n; i ++)
            f >> D[i];
        for(int i = 1; i <= m; i ++) {
            f >> a >> b >> c;
            L[a].push_back(make_pair(b, c));
            L[b].push_back(make_pair(a, c));
        }

        for(int i = 1; i <= n; i ++)
            viz[i] = false, d[i] = 100000000;
        d[s] = 0;
        q.push(make_pair(0,s));
        while(!q.empty()) {
            int poz = q.top().second;
            q.pop();
            viz[poz] = true;
            for(int j = 0; j < L[poz].size(); j ++) {
                if(!viz[L[poz][j].first] && d[L[poz][j].first] > d[poz] + L[poz][j].second) {
                    d[L[poz][j].first] = d[poz] + L[poz][j].second;
                    q.push(make_pair(-d[L[poz][j].first], L[poz][j].first));
                }
            }
        }
        bool ok = true;
        for(int i = 1; i <= n; i ++) {
            if(d[i] != D[i])
                ok = false;
            L[i].clear();
        }
        if(!ok)
            g << "NU\n";
        else g << "DA\n";
        t --;
    }
    return 0;
}