Cod sursa(job #2814629)

Utilizator PopaMihaimihai popa PopaMihai Data 8 decembrie 2021 12:40:39
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <bits/stdc++.h>

using namespace std;

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

struct str
{
    int cost;
    int nod;
};

constexpr int NMAX = 5e4 + 3, INF = 1e9;

int d[NMAX], n, m, a, b, c, t, s;
pair <int, int> aint[4 * NMAX];
bool sel[NMAX];

void update(int nod, int L, int R, int poz, int val)
{
    if(L == R){
        aint[nod].first = val;
        aint[nod].second = poz;
        return;
    }

    int mid = (L + R) >> 1;

    if(poz <= mid)
        update(2 * nod, L, mid, poz, val);
    else update(2 * nod + 1, mid + 1, R, poz, val);

    if(aint[2 * nod].first < aint[2 * nod + 1].first)
        aint[nod] = aint[2 * nod];
    else aint[nod] = aint[2 * nod + 1];
}



void dijkstra ()
{
    vector <str> G[NMAX];
    vector <int> ans;

    int x;
    fin >> n >> m >> s;
    ans.push_back(0);
    for(int i = 1; i <= n; i++)
        fin >> x, ans.push_back(x);

    for(int i = 1; i <= m; i++) {
        fin >> a >> b >> c;
        G[a].push_back({c, b});
        G[b].push_back({c, a});
    }

    int dmin, poz;

    for(int i = 1; i < NMAX; i++) {
        sel[i] = false;
        update(1, 1, n, i, INF);
        d[i] = INF;
    }

    d[s] = 0;
    update(1, 1, n, s, 0);

    for(int i = 1; i <= n; i++)
    {
        dmin = aint[1].first;
        poz = aint[1].second;

        sel[poz] = true;
        update(1, 1, n, poz, INF);
        for(auto it: G[poz]) {
            if(!sel[it.nod] && dmin + it.cost < d[it.nod]) {
                d[it.nod] = dmin + it.cost;
                update(1, 1, n, it.nod, dmin + it.cost);
            }
        }
    }

    bool ok = true;
    for(int i = 1; i <= n && ok; i++) {
        if(d[i] != ans[i])
            ok = false;

    }
    fout << (ok ? "DA" : "NU" ) << '\n';
}

int main()
{
    fin >> t;
    for(int i = 1; i <= t; i++)
        dijkstra();
    return 0;
}