Cod sursa(job #2830084)

Utilizator andreea_07Andreea Georgescu andreea_07 Data 9 ianuarie 2022 14:25:22
Problema Distante Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <bits/stdc++.h>
#define infinit INT_MAX

using namespace std;

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

void dijk(int s, int n, vector <vector <pair <int, int>>> &graf,vector <int> &distanta)
{
    priority_queue <pair <int, int>> pq;

    distanta[s] = 0;
    pq.push(make_pair(0, s));
    while (!pq.empty())
    {
        //cout<<pq.top().first<<" ";
        int nod = pq.top().second;
        pq.pop();
        for (auto element: graf[nod])
        {
            int vecin = element.first;
            int cost = element.second;
            if (distanta[nod] + cost < distanta[vecin])
            {
                distanta[vecin] = distanta[nod] + cost;
                pq.push(make_pair(distanta[vecin], vecin));
            }
        }
    }


}

int main()
{
    int teste;
    fin >> teste;
    for (int i = 1; i <= teste; i++)
    {
        int n, m, s;
        fin >> n >> m >> s;

	vector <vector <pair <int, int>>> graf;

        graf.resize(n + 1);

        vector <int> distanta(n + 1, infinit);

        vector <int> dist_init(n + 1, 0);

        for (int j = 1; j <= n; j++)
            fin >>dist_init[j];

        


        for (int j = 1; j <= m; j++)
        {
            int x, y, c;
            fin >> x >> y >> c;
            graf[x].push_back(make_pair(y, c));
            graf[y].push_back(make_pair(x, c));
        }

        dijk(s, n, graf,distanta);

        bool ok = 1;


        for (int j = 1; j <= n; j++)
            if (distanta[j] != dist_init[j])
            {
                ok = 0;
                fout << "NU" << "\n";
                break;
            }
        if (ok == 1)
            fout << "DA" << "\n";
    }



    return 0;
}