Cod sursa(job #2830822)

Utilizator RoberttoPopescu Paullo Robertto Karloss Robertto Data 10 ianuarie 2022 12:01:02
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 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;
bool check;
int p[50000], a[50000];

struct muchie {
    int destinatie, cost;
    muchie(int destinatie, int cost) : destinatie(destinatie), cost(cost) {};
};

vector<vector<muchie>> listaDeAdiacenta;

void dijkstra(const int startNode) {
    const int maxValue = 1000000000;
    vector<bool> checkedNodes(50000, false);
    struct Nod {
        int nod, cost;
        Nod(int n, int w) : nod(n), cost(w) {};
        bool operator<(const Nod &ob) const {
            return cost > ob.cost;
        }
    };
    priority_queue<Nod> minHeap;
    for (int i = 1; i <= nrNoduri; i++)
        a[i] = maxValue;
    int nodCurent = startNode;
    a[nodCurent] = 0;
    minHeap.push(Nod(nodCurent, 0));
    while (minHeap.size() > 0)
        if (checkedNodes[minHeap.top().nod])
            minHeap.pop();
        else {
            nodCurent = minHeap.top().nod;
            for (auto i: listaDeAdiacenta[nodCurent])
                if (a[i.destinatie] > a[nodCurent] + i.cost) {
                    a[i.destinatie] = a[nodCurent] + i.cost;
                    minHeap.push(Nod(i.destinatie, a[i.cost]));
                }
            checkedNodes[nodCurent] = true;
        }
    for (int i = 1; i <= nrNoduri; i++)
        if (a[i] == maxValue)
            a[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 >> p[j];
        if (i > 1)
            for (int i = 1; i <= nrNoduri; i++)
                listaDeAdiacenta[i].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 (a[j] != p[j]) {
                check = false;
                break;
            }
        if (check)
            fout << "DA\n";
        else
            fout << "NU\n";
    }

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