Cod sursa(job #2714926)

Utilizator vlad_butnaruVlad Butnaru vlad_butnaru Data 2 martie 2021 18:48:36
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in ("distante.in");
ofstream out ("distante.out");
int n, m, source;
int rasp_copil_prost[50001];
int rasp[50001];
int dist[50001];
bool viz[50001];
bool ok;
vector <pair <int, int> > v[50001];
void dijkstra (int start)
{
    set <pair <int, int> > seti;
    seti.insert({0, start});
    dist[start] = 0;
    while (!seti.empty())
    {
        int cost = (*seti.begin()).first;
        int nod = (*seti.begin()).second;
        seti.erase(seti.begin());
        if (viz[nod])
            continue;
        if (dist[nod] != rasp_copil_prost[nod])
            ok = 0;
        viz[nod] = 1;
        for (auto vecin: v[nod])
        {
            int to = vecin.first;
            int cost_to = vecin.second;
            if (!viz[to] && dist[to] > cost + cost_to)
            {
                seti.insert({cost + cost_to, to});
                dist[to] = min (dist[to], cost + cost_to);
            }
        }
    }
}
void solve ()
{
    in >> n >> m >> source;
    for (int i = 1;i<=n;++i)
    {
        in >> rasp_copil_prost[i];
        viz[i] = 0;
        dist[i] = 1<<30;
        v[i].clear();
    }
    for (int i = 1;i<=m;++i)
    {
        int a, b, c;
        in >> a >> b >> c;
        v[a].push_back({b,c});
        v[b].push_back({a,c});
    }
    ok = 1;
    dijkstra(source);
    if (ok == 1)
        out << "DA\n";
    else
        out << "NU\n";
}
int main ()
{
    int t;
    in >> t;
    while (t--)
        solve();
}