Cod sursa(job #2761122)

Utilizator NeuerRaducu Ioan Stefan Neuer Data 30 iunie 2021 18:18:06
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
///#include <iostream>
#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], viz[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 dijkstra()
{
    int nod, nxt;
    pair <int, int> cnod;
    set <pair<int, int>> q;
    q.insert({0, start});
    d[start]=0;
    while(!q.empty())
    {
        cnod=*q.begin();
        q.erase(q.begin());
        nod=cnod.second;
        if(viz[nod]) continue;
        viz[nod]=1;
        for(auto cnxt : v[nod])
        {
            nxt=cnxt.second;
            if(d[nxt]>d[nod]+cnxt.first)
                d[nxt]=d[nod]+cnxt.first,
                q.insert({d[nxt], 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;
}