Cod sursa(job #2830895)

Utilizator RoberttoPopescu Paullo Robertto Karloss Robertto Data 10 ianuarie 2022 13:15:07
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb

#include <fstream>
#include <algorithm>
#include <queue>
#include <iterator>
#include <vector>
#include <unordered_set>

using namespace std;

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

int nrGrafuri, nrNoduri, nrMuchii, sursa, input;
bool check;
int distanteDate[50002], distante[50002];

struct muchie {
    int destinatie, cost;

    muchie(int x, int y) : destinatie(x), cost(y) {};
};

vector<vector<muchie>> listaDeAdiacenta;

void dijkstra(int nodPlecare) {
    int maxi = 1000000002;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> minHeap; // {cost, nodDestinatie} minHeap;
    vector<bool> vizitat(50002, false);
    for (int i = 1; i <= nrNoduri; i++)
        distante[i] = maxi;
    distante[nodPlecare] = 0;
    minHeap.push(make_pair(0, nodPlecare));
    while (!minHeap.empty()) {
        int nodCurent = minHeap.top().second;
        minHeap.pop();
        if (!vizitat[nodCurent]) {
            vizitat[nodCurent] = true;
            for (auto &i: listaDeAdiacenta[nodCurent])
                if (distante[nodCurent] + i.cost < distante[i.destinatie]) {
                    distante[i.destinatie] = distante[nodCurent] + i.cost;
                    minHeap.push(make_pair(distante[i.destinatie], i.destinatie));
                }
        }
    }
    for (int i = 1; i <= nrNoduri; i++)
        if (distante[i] == maxi)
            distante[i] = 0;
}

int main() {
    listaDeAdiacenta = vector<vector<muchie>>(50000, vector<muchie>());
    fin >> nrGrafuri;
    for (int i = 1; i <= nrGrafuri; i++) {
        fin >> nrNoduri >> nrMuchii >> sursa;
        for (int j = 1; j <= nrNoduri; j++)
            fin >> distanteDate[j];
//        if (i > 1) {
//            for (int j = 1; j <= nrNoduri; j++)
//                listaDeAdiacenta[j].clear();
//        }
        for (int i = 1; i <= nrMuchii; i++) {
            int x, y, c;
            fin >> x >> y >> c;
            listaDeAdiacenta[x].push_back(muchie(y, c));
            listaDeAdiacenta[y].push_back(muchie(x, c));
        }
        dijkstra(sursa);
        check = true;
        for (int j = 1; j <= nrNoduri; j++)
            if (distante[j] != distanteDate[j]) {
                check = false;
                break;
            }
        if (check)
            fout << "DA\n";
        else
            fout << "NU\n";
    }

    fin.close();
    fout.close();
    return 0;
}