Cod sursa(job #3157157)

Utilizator SSKMFSS KMF SSKMF Data 14 octombrie 2023 15:10:36
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;

ifstream cin ("distante.in");
ofstream cout ("distante.out");

vector < pair <int , int> > adiacenta[50001];
int distanta[2][50001];
bool adaugat[50001];

int main ()
{
    int numar_teste;
    cin >> numar_teste;

    while (numar_teste--)
    {
        int numar_noduri , numar_muchii , nod_sursa;
        cin >> numar_noduri >> numar_muchii >> nod_sursa;

        for (int indice = 1 ; indice <= numar_noduri ; indice++)
            { cin >> distanta[0][indice]; distanta[1][indice] = 1e9; }

        for (int indice = 1 , nod[2] , cost ; indice <= numar_muchii ; indice++)
            { cin >> nod[0] >> nod[1] >> cost; adiacenta[nod[0]].push_back(make_pair(nod[1] , cost)); adiacenta[nod[1]].push_back(make_pair(nod[0] , cost)); }

        adaugat[nod_sursa] = true;
        priority_queue < pair <int , int> > optiuni;
        optiuni.push(make_pair(distanta[1][nod_sursa] = 0 , nod_sursa));
        while (!optiuni.empty())
        {
            const int nod_actual = optiuni.top().second;
            optiuni.pop();

            for (auto nod_vecin : adiacenta[nod_actual])
                if (distanta[1][nod_actual] + nod_vecin.second < distanta[1][nod_vecin.first])
                {
                    distanta[1][nod_vecin.first] = distanta[1][nod_actual] + nod_vecin.second;
                    if (!adaugat[nod_vecin.first]) { 
                        optiuni.push(make_pair(-distanta[1][nod_vecin.first] , nod_vecin.first)); 
                        adaugat[nod_vecin.first] = true; 
                    }
                }

            adaugat[nod_actual] = false;
        }

        bool diferit = false;
        for (int indice = 1 ; indice <= numar_noduri && !diferit ; indice++)
            diferit |= (distanta[0][indice] != distanta[1][indice]);

        for (int indice = 1 ; indice <= numar_noduri ; indice++)
            adiacenta[indice].clear();

        cout << (diferit ? "NU\n" : "DA\n");
    }

    cout.close(); cin.close();
    return 0;
}