Cod sursa(job #2755585)

Utilizator Casian_doispeChiriac Casian Casian_doispe Data 27 mai 2021 18:34:35
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <vector>
#include <deque>
#include <cstring>
#include <queue>
#include <limits.h>
#include <unordered_set>

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

int n ;

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

int cost[50009], tatal[50009], verif[50009] ;

int main()
{

    int q ;

    int qq ;

    cin >> qq ;

    while(qq --)
    {

    int sursa ;

    cin >> n >> q >> sursa ;

    int expected[50009] ;

    for(int f = 1 ; f <= n ; f ++)
        cin >> expected[f], verif[f] = 0 ;

    while(q --)
    {

        int a, b, c ;

        cin >> a >> b >> c ;

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

    }

    for(int f = 1 ; f <= n ; f ++)
        cost[f] = INT_MIN ;

    priority_queue<pair<int, int> > pq ;

    pq.push({0, sursa}) ; /// intai cost si dupa nod

    cost[sursa] = 0 ;

    while(pq.size())
    {

        int nod_val = pq.top().first ;
        int nod_curent = pq.top().second ;

        pq.pop() ;

        if(!verif[nod_curent])
        {

        verif[nod_curent] = 1 ;

        for(int f = 0 ; f < v[nod_curent].size() ; f ++) /// extindem pathul acesta
        {

            int nod_destinatie = v[nod_curent][f].first ;
            int cost_local = v[nod_curent][f].second ;

            /// trebuie vazut daca nod_val + cost_local este mai mic ca cost

            if(nod_val - cost_local > cost[nod_destinatie])
            {

                cost[nod_destinatie] = nod_val - cost_local ;

                pq.push({cost[nod_destinatie], nod_destinatie}) ;

            }

        }

        }

    }

    for(int f = 1 ; f <= n ; f ++)
        if(cost[f] == INT_MIN)cost[f] = 0 ;

    for(int f = 1 ; f <= n ; f ++)
        cost[f] *= -1 ;

    for(int f = 1 ; f <= n ; f ++)
        if(expected[f] != cost[f])n = 0 ;

    if(!n)cout << "NU" ;
        else cout << "DA" ;

    cout << '\n' ;

    }

    return 0;
}