Cod sursa(job #3327904)

Utilizator andrei0simionAndrei Simion andrei0simion Data 5 decembrie 2025 17:04:03
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 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({ 0, nodSursa });
    graf[nodSursa].vizitat = true;
    graf[nodSursa].distantaDijkstra = 0;
    if(graf[nodSursa].distantaCalc != graf[nodSursa].distantaDijkstra)
        good = false;

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

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

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

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

    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;
}