Cod sursa(job #2769962)

Utilizator Edyci123Bicu Codrut Eduard Edyci123 Data 18 august 2021 15:59:55
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
#define NMAX 50005
#define INF 0x3f3f3f3f

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

int q, n, m, start, d[NMAX], a[NMAX];
vector <pair <int, int>> edges[NMAX];
set <pair <int, int>> s;

void dijkstra(int start)
{
    memset(d, INF, sizeof(d));

    d[start] = 0;
    s.insert(make_pair(0, start));

    while(!s.empty())
    {
        int nod = (*s.begin()).second;
        s.erase(s.begin());
        for(auto child : edges[nod])
            if(d[child.first] > d[nod] + child.second)
            {
                s.erase(make_pair(d[child.first], child.first));
                d[child.first] = d[nod] + child.second;
                s.insert(make_pair(d[child.first], child.first));
            }
    }
}

int main()
{
    f >> q;

    while(q--)
    {
        f >> n >> m >> start;
        for(int i = 1; i <= n; i++)
            f >> a[i];
        for(int i = 1; i <= m; i++)
        {
            int x, y, cost;
            f >> x >> y >> cost;
            edges[x].push_back(make_pair(y, cost));
            edges[y].push_back(make_pair(x, cost));
        }
        dijkstra(start);

        bool ok = 1;
        for(int i = 1; i <= n; i++)
            if(a[i] != d[i])
            {
                ok = 0;
                break;
            }
        if(ok == 0)
            g << "NU\n";
        else
            g << "DA\n";
        for(int i = 1; i <= n; i++)
            edges[i].clear();
    }

    return 0;
}