Cod sursa(job #2855499)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 22 februarie 2022 15:28:44
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <deque>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#include <cstring>
#include <climits>

#define MOD 104659

using namespace std ;

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

int viz[50009], d[50009], dbr[50009] ;

vector<pair<int, int> > v[50009] ;

void dijakstra(int st)
{
    priority_queue<pair<int, int> > pq ;

    pq.push({0, st}) ;

    while(pq.size())
    {
        int nod = pq.top().second ;
        int cost = pq.top().first ;

        pq.pop() ;

        if(!viz[nod])
        {
        viz[nod] = 1 ;
        d[nod] = cost ;

        if(d[nod] * -1 != dbr[nod])return ;

        for(int f = 0 ; f < v[nod].size() ; f ++)
            if(!viz[v[nod][f].first])pq.push({cost - v[nod][f].second, v[nod][f].first}) ;
        }
    }
}

int main()
{
    int q ;

    cin >> q ;

    while(q --)
    {
         int n, m, start ;

         cin >> n >> m >> start ;

         for(int f = 1 ; f <= n ; f ++)
            cin >> dbr[f] ;

         while(m --)
         {
             int a, b, c ;

             cin >> a >> b >> c ;

             v[a].push_back({b, c}) ;
             v[b].push_back({a, c}) ;
         }

         dijakstra(start) ;

         int ok = 1 ;

         for(int f = 1 ; f <= n ; f ++)
            if(d[f] * -1 != dbr[f])ok = 0 ;

         if(ok == 0)cout << "NU" << '\n' ;
            else cout << "DA" << '\n' ;

        for(int f = 1 ; f <= n ; f ++)
            v[f].clear() ;

        for(int f = 1 ; f <= n ; f ++)
            d[f] = 0, viz[f] = 0 ;
    }

    return 0 ;
}