Cod sursa(job #1902525)

Utilizator RaresEGaySopterean Adrian RaresEGay Data 4 martie 2017 17:21:16
Problema Distante Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define maxn 50005


using namespace std;

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

vector < pair<int, int> > v[maxn];

int n, m, t, s;
int dist[maxn], c[maxn];
int sptSet[maxn];

void dijkstra(int a){
    for(int i = 1; i <= n; ++i){
        dist[i] = INF;
    }

    priority_queue < pair <int, int>, vector < pair <int, int> >, greater < pair <int, int> > > pq;

    dist[a] = 0;
    pq.push(make_pair(dist[a], a));

    while(!pq.empty()){
        int u = pq.top().second;
        pq.pop();

        if(!sptSet[u]){
            sptSet[u] = 1;
            for(int i = 0; i < v[u].size(); ++i){
                int nod = v[u][i].first;
                int distance = v[u][i].second;

                if(dist[nod] > dist[u] + distance){
                    dist[nod] = dist[u] + distance;
                    pq.push(make_pair(dist[nod], nod));
                }
            }
        }
    }
    for(int i = 1; i <= n; ++i)
        v[i].clear();


}



int main(){
    f >> t;
    for(int k = 1; k <= t; ++k){
        int ok = 0;
        f >> n >> m >> s;
        for(int i = 1; i <= n; ++i)
            f >> c[i];
        for(int i = 1; i <= m; ++i){
            int x, y, d;
            f >> x >> y >> d;
            v[x].push_back(make_pair(y, d));
            v[y].push_back(make_pair(x, d));
        }


        dijkstra(s);

        for(int i = 1; i <= n; ++i){
            if(dist[i] != c[i]){
                ok = 1;
                break;
            }
        }

        if(ok) g << "NU" << '\n';
        else g << "DA" << '\n';
    }
}