Cod sursa(job #3327925)

Utilizator andrei0simionAndrei Simion andrei0simion Data 5 decembrie 2025 17:40:01
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <set>

using namespace std;

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

struct Muchie
{
    int nodS;
    int nodE;
    int cost;
};

struct Nod
{
    int distantaCalc;
    vector<Muchie> muchii;

    bool vizitat = false;
    int distantaDijkstra = 0;
};

void RezTest()
{
    int nrNoduri;
    in >> nrNoduri;

    int nrMuchii;
    in >> nrMuchii;

    int nodSursa;
    in >> nodSursa;
    nodSursa--;

    vector<Nod> graf;
    for(int i = 0; i < nrNoduri; i++)
    {
        Nod n;
        in >> n.distantaCalc;
        graf.push_back(n);
    }
    for(int i = 0; i < nrMuchii; i++)
    {
        Muchie mS;
        in >> mS.nodS;
        mS.nodS--;
        in >> mS.nodE;
        mS.nodE--;
        in >> mS.cost;
        graf[mS.nodS].muchii.push_back(mS);

        Muchie mE;
        mE.nodS = mS.nodE;
        mE.nodE = mS.nodS;
        mE.cost = mS.cost;
        graf[mE.nodS].muchii.push_back(mE);
    }

    bool good = true;
    set<pair<int, int> > st;

    st.insert({ graf[nodSursa].distantaDijkstra, nodSursa });

    while(!st.empty())
    {
        pair<int, int> nodCrt = *(st.begin());
        st.erase(nodCrt);

        if(graf[nodCrt.second].vizitat)
                continue;

        graf[nodCrt.second].vizitat = true;
        graf[nodCrt.second].distantaDijkstra = nodCrt.first;

        if(graf[nodCrt.second].distantaDijkstra != graf[nodCrt.second].distantaCalc)
        {
            good = false;
            break;
        }

        for(int i = 0; i < graf[nodCrt.second].muchii.size(); i++)
        {
            int newNod = graf[nodCrt.second].muchii[i].nodE;
            if(graf[newNod].vizitat)
                continue;

            st.insert({ nodCrt.first + graf[nodCrt.second].muchii[i].cost, newNod });
        }
    }

    if(good)
        out << "DA\n";
    else
        out << "NU\n";
}

int main()
{
    int nrTeste;
    in >> nrTeste;

    for(int i = 0; i < nrTeste; i++)
    {
        RezTest();
    }

    return 0;
}