Cod sursa(job #2830713)

Utilizator Pop_MariaPop Maria Pop_Maria Data 10 ianuarie 2022 10:32:32
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define  INF 0x3f3f3f3f

using namespace std;

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

int numar_grafuri, numar_noduri, numar_muchii, nod_sursa;
int capat_stang, capat_drept, cost;
vector <vector <pair <int, int>>> lista_adiacenta;

void dijkstra(int numar_noduri, int numar_muchii, int nod_sursa, vector <int> distante)
{
    int nod, vizitat[numar_noduri + 1] = {};
    priority_queue <pair <int, int>> coada;

    for(int i = 1; i<= numar_noduri; i++)
        distante[i] = INF;

    distante[nod_sursa] = 0;
    coada.push({0, nod_sursa});

    while(coada.size() > 0)
    {
        nod = coada.top().second;
        coada.pop();

        if(!vizitat[nod])
            vizitat[nod] = 1;
        else
            continue;

        for(auto x : lista_adiacenta[nod])
            if(distante[x.first] > distante[nod] + x.second)
        {
            distante[x.first] = distante[nod] + x.second;
            coada.push(make_pair(-distante[x.first], x.first));
        }
    }

}

int main()
{
    fin >> numar_grafuri;

    for(int i = 0; i < numar_grafuri; i++)
    {
        int ok = 1;

        fin >> numar_noduri >> numar_muchii >> nod_sursa;

        lista_adiacenta.resize(numar_noduri + 1);
        vector <int> distante(numar_noduri + 1, INF);
        vector <int> d(numar_noduri + 1);

        for(int j = 1; j <= numar_noduri; j++)
            fin >> d[j];

        for(int j = 1; j <= numar_muchii; j++)
        {
            fin >> capat_stang >> capat_drept >> cost;
            lista_adiacenta[capat_stang].push_back(make_pair(capat_drept, cost));
            lista_adiacenta[capat_drept].push_back(make_pair(capat_stang, cost));
        }

        dijkstra(numar_noduri, numar_muchii, nod_sursa, distante);

        for(int j = 1; j <= numar_noduri&&ok; j++)
            if(d[i] != distante[i])
                ok = 0;

        if(ok)
            fout << "DA\n";
        else
            fout << "NU\n";

        lista_adiacenta.clear();
    }

    fin.close();
    fout.close();

    return 0;
}