Cod sursa(job #2761125)

Utilizator NeuerRaducu Ioan Stefan Neuer Data 30 iunie 2021 18:33:44
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
///#include <iostream>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("O3")
#include <fstream>
#include <set>
const int SIZE = 5e4+10,
          INF = 1e8;

using namespace std;

ifstream cin("distante.in");
ofstream cout("distante.out");

int t, n, m, start;
int dists[SIZE], d[SIZE];
set <pair<int, int>> v[SIZE];

void reset()
{
    for(int i=1; i<=n; i++)
        d[i]=INF, v[i].clear();
}

void cinGraph()
{
    int y, x, c;
    for(int i=1; i<=m; i++)
    {
        cin>>y>>x>>c;
        v[y].insert({c, x});
        v[x].insert({c, y});
    }
}

void coutSet(auto st)
{
    for(auto el : st) cout<<"\t - "<<el.first<<' '<<el.second<<"\n";
    cout<<"***\n";
}

void dijkstra()
{
    int nod, nxt;
    pair <int, int> cnod;
    set <pair<int, int>> q;
    q.insert({0, start});
    while(!q.empty())
    {
        cnod=*q.begin();
        q.erase(q.begin());
        nod=cnod.second;
        if(d[nod]==INF)
        {
            d[nod]=cnod.first;
            for(auto cnxt : v[nod])
            {
                nxt=cnxt.second;
                if(d[nxt]>d[nod]+cnxt.first)
                    q.insert({d[nod]+cnxt.first, nxt});
            }
        }
    }
}

bool check()
{
    for(int i=1; i<=n; i++)
        if(dists[i]!=d[i])
            return 0;
    return 1;
}

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>start;
        reset();
        for(int i=1; i<=n; i++)
            cin>>dists[i];
        cinGraph();
        dijkstra();
        if(check()) cout<<"DA\n";
        else cout<<"NU\n";
    }
    return 0;
}