Cod sursa(job #2292704)

Utilizator skoda888Alexandru Robert skoda888 Data 29 noiembrie 2018 20:53:22
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <climits>

#define INF INT_MAX

int dist[50005];

struct Compare{
    bool operator()(int a, int b){
        return (dist[a] > dist[b]);
    }
};

int main()
{

    std::ifstream in("distante.in");
    std::ofstream out("distante.out");

    int T;
    in >> T;

    while(--T >= 0){
        int N, M, sursa;
        in >> N >> M >> sursa;

        int Bronzarel[N + 1];
        for(int i = 1; i <= N; ++i){
            in >> Bronzarel[i];
        }

        bool viz[50005] = {};
        for(int i = 0; i <= N; ++i){
            dist[i] = INF;
        }
        dist[sursa] = 0;
        std::vector< std::pair<int, int> > Graf[N + 1];
        for(int i = 1; i <= M; ++i){
            int x, y, cost;
            in >> x >> y >> cost;
            Graf[x].push_back(std::make_pair(y, cost));
            Graf[y].push_back(std::make_pair(x, cost));
        }
        //std::cout << '*';
        std::priority_queue<int, std::vector<int>, Compare> Coada;
        Coada.push(sursa);
        viz[sursa] = true;

        while(!Coada.empty()){
            int nod_curent = Coada.top();
            Coada.pop();
            viz[sursa] = false;

            for(int i = 0; i < Graf[nod_curent].size(); ++i){
                int Capat = Graf[nod_curent][i].first;
                int Cost = Graf[nod_curent][i].second;

                if(dist[nod_curent] + Cost < dist[Capat]){
                    dist[Capat] = dist[nod_curent] + Cost;
                    if(!viz[Capat]){
                        Coada.push(Capat);
                        viz[Capat] = true;
                    }
                }
            }
        }
        bool OK = true;
        for(int i = 1; i <= N; ++i){
            if(dist[i] != Bronzarel[i]){
                OK = false;
                break;
            }
        }
        if(OK == false){
            out << "NU";
        }
        else{
            out << "DA";
        }
        out << '\n';
    }


    return 0;
}