Cod sursa(job #2829784)

Utilizator vlad_dimaVlad Dima vlad_dima Data 8 ianuarie 2022 22:43:12
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <bits/stdc++.h>
 
using namespace std;
 
class ComparePair
{
public:
    bool operator() (pair<int,int> a, pair<int,int> b)
    {
        return a.second > b.second;   // compar costurile
    }
};
 
int main()
{
    ifstream in("distante.in");
    ofstream out("distante.out");
    int T, N, M, S;
 
    in >> T;
 
    for (int i = 0; i < T; i++)
    {   
        in >> N >> M >> S;
        vector<int> distFoaie, distMele(N+1,1001);
        vector<vector<pair<int,int>>> lsAdCost(N+1);
 
        for (int j = 0; j < N; j++)
            {
                int x;
                in >> x;
                distFoaie.push_back(x);
            }
 
        for (int j = 0; j < M; j++)
        {
            int x, y, c;
            in >> x >> y >> c;
            lsAdCost[x].push_back({y,c});
            lsAdCost[y].push_back({x,c});
        }
 
        priority_queue<pair<int,int>,vector<pair<int,int>>,ComparePair> heap; //folosesc din nou un priority queue drept heap

        vector<bool> vizitat(N+1);

        heap.push(make_pair(1,0));

        while (!heap.empty())
        {
            pair<int,int> tupluCrt = heap.top(); //in tuplu am nodul si costul catre nod
            heap.pop();

            if (!vizitat[tupluCrt.first])
            {
                vizitat[tupluCrt.first] = true;
                distMele[tupluCrt.first] = tupluCrt.second;

                for (auto vecin : lsAdCost[tupluCrt.first])
                {
                    //pentru fiecare vecin il adaug in heap cu costul curent plus costul arcului
                    if(distMele[vecin.first] > tupluCrt.second + vecin.second)
                        heap.push(make_pair(vecin.first,tupluCrt.second + vecin.second));
                }
            }
        }
        bool egale = 1;
        for (int j = 0; j < N && egale; j++)
            if (distFoaie[j] != distMele[j+1])
                egale = 0;
        if (egale)
            out << "DA\n";
        else
            out << "NU\n";
    }
 
    
}