Cod sursa(job #2830111)

Utilizator vlad_dimaVlad Dima vlad_dima Data 9 ianuarie 2022 15:10:04
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 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,1000000);
        vector<vector<pair<int,int>>> lsAdCost(N+1);
        priority_queue<pair<int,int>,vector<pair<int,int>>, ComparePair> heap;

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

        distMele[S] = 0;
        heap.push({S,0});
        
        while (!heap.empty())
        {
            int nodCrt = heap.top().first;
            heap.pop();
            for (auto vecin : lsAdCost[nodCrt])
            {
                if (distMele[nodCrt] + vecin.second < distMele[vecin.first])
                {
                    distMele[vecin.first] = distMele[nodCrt] + vecin.second;
                    heap.push({vecin.first,distMele[vecin.first]});
                }
            }
        }
        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";
    }
 
    
}