Cod sursa(job #2832180)

Utilizator Pop_MariaPop Maria Pop_Maria Data 13 ianuarie 2022 05:22:24
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 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(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(distante);

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

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

        lista_adiacenta.clear();
    }

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

    return 0;

}