Cod sursa(job #3243091)

Utilizator StefanStratonStefan StefanStraton Data 15 septembrie 2024 17:21:45
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <fstream>
#include <vector>
#include <set>
using namespace std;
const int INF = 1e9 + 7;

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

void rezolva() {
    int n, numar_muchii, nod_sursa;
    fin >> n >> numar_muchii >> nod_sursa;

    vector<int> distante_calculate(n + 1);
    vector<int> distante_corecte(n + 1, INF);
    vector< pair<int, int>> muchii[n + 1];

    // distanțele calculate de Bronzarel
    for (int i = 1; i <= n; ++i) {
        fin >> distante_calculate[i];
    }

    for (int i = 0; i < numar_muchii; ++i) {
        int nod1, nod2, cost;
        fin >> nod1 >> nod2 >> cost;

        muchii[nod1].push_back({nod2, cost});
        muchii[nod2].push_back({nod1, cost});
    }

    set< pair<int, int>> set_dijkstra;
    distante_corecte[nod_sursa] = 0;
    set_dijkstra.insert({0, nod_sursa});

    while (!set_dijkstra.empty()) {
        pair<int, int> cel_mai_apropiat = *(set_dijkstra.begin());
        int distanta_curenta = cel_mai_apropiat.first;
        int nod_curent = cel_mai_apropiat.second;
        set_dijkstra.erase(set_dijkstra.begin());

        for (pair<int, int> muchie : muchii[nod_curent]) {
            int vecin = muchie.first;
            int cost = muchie.second;

            if (distante_corecte[vecin] > distanta_curenta + cost) {
                if (set_dijkstra.find({distante_corecte[vecin], vecin}) != set_dijkstra.end()) {
                    set_dijkstra.erase(set_dijkstra.find({distante_corecte[vecin], vecin}));
                }
                distante_corecte[vecin] = distanta_curenta + cost;
                set_dijkstra.insert({distante_corecte[vecin], vecin});
            }
        }
    }

    for (int i = 1; i <= n; ++i) {
        if (distante_calculate[i] != distante_corecte[i]) {
            fout << "NU\n";
            return;
        }
    }

    fout << "DA\n";
}

int main() {
    int n;
    fin >> n;
    while (n--) {
        rezolva();
    }
    return 0;
}