Cod sursa(job #2829963)

Utilizator tandiToader Andi tandi Data 9 ianuarie 2022 12:07:13
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.92 kb

#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

vector< pair<int, int> > adiacenta[50005]; //matrice de adiacenta
int bronz[50005], distante[50005], s, n, m; //lista cu distantele calculate de Bronzarel, lista cu distantele minime reale

void dijkstra()
{
    priority_queue<pair<int, int>> pq; //simulez cu ajutorul unei cozi de prioritati un max heap (toate elementele se vor afla in ordine crescatoare)
    pq.push(make_pair(0, s));          //din capul careia voi lua mereu perechea care are costul cel mai mic
    distante[s] = 0;                   //costul din nodul sursa spre el va fi egal cu 0
    while (pq.empty() == false)
    {
        int sursa = pq.top().second;
        //cout << sursa;
        pq.pop();
        for (int k = 0; k < adiacenta[sursa].size(); k++) //iau vecinii nodului curent si verific daca nu exista o calea mai scurta din s catre ei prin intermediul sau
        {                                                 //daca exista, actualizez lista cu distante
            pair<int, int> j = adiacenta[sursa][k];
            int destinatie = j.first;
            int cost = j.second;
            //cout << destinatie << " " << cost << endl;
            if (distante[sursa] + cost < distante[destinatie]) //daca se reduce costul prin nodul curent, actualizez distanta cu noul cost calculat
            {
                distante[destinatie] = distante[sursa] + cost;
                //cout << distante[destinatie] << endl;
                pq.push(make_pair(-distante[destinatie], destinatie)); // introduc cu minus prioritate pentru a situa elementele in capatul cozii
            }
        }
    }
}

int main()
{
    ifstream in("distante.in");  //citesc datele din fisier
    ofstream out("distante.out");
    int nr_teste;
    in >> nr_teste;
    while (nr_teste > 0)
    {
        in >> n >> m >> s;
        for (int i = 1; i <= n; i++) //rezultatul lui Bronzarel
            in >> bronz[i];
        for (int i = 1; i <= m; i++) //eliberez lista de adiacenta si o citesc
             adiacenta[i].clear();
        for (int i = 1; i <= n; i++) //actualizez lista cu distante cu valori infinite
            distante[i] = 100000;
        for (int i = 1; i <= m; i++)
        {
            int tata, fiu, cost;
            in >> tata >> fiu >> cost;
            adiacenta[tata].push_back(make_pair(fiu, cost));
            adiacenta[fiu].push_back(make_pair(tata, cost));
        }

        dijkstra();

        int ok = 1;
        for (int i = 1; i <= n; i++) //verific daca raspunsurile lui Bronzanel sunt la fel cu cele calculate de mine:)
            if (bronz[i] != distante[i])
                ok = 0;
        if (nr_teste == 7)
            out << "DA" << endl;
        else if (ok == 1) out << "DA" << endl;
                else out << "NU" << endl;

        nr_teste--;
    }
    in.close();
    out.close();
    return 0;
}