Cod sursa(job #3273484)

Utilizator Robert_OprisanRobert Oprisan Robert_Oprisan Data 2 februarie 2025 13:25:06
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <climits>

using namespace std;


const int NMAX = 50001;
int n,m,s,t;
bool isInQueue[NMAX];
int Schizophrenia_lui_Zaharel[NMAX],cost[NMAX];

struct PATH{
    int nod,cost;
};
vector <PATH> v[NMAX];
struct compara
{
    bool operator()(int x, int y)
    {
        return cost[x] > cost[y];
    }
};
priority_queue<int, vector<int>, compara> q;


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

void Dijkstra(int start){
    for(int i = 1; i <= n; i++){
        cost[i] = INT_MAX;
    }
    cost[start] = 0;
    q.push(start);
    isInQueue[start] = true;
    while(!q.empty()){
        int nod = q.top();
        q.pop();
        isInQueue[nod] = false;
        for(PATH neigh_path : v[nod]){ // neigh_path reprezinta drumul de la nodul curent la un nod vecin
            int neigh = neigh_path.nod;// vecin
            int c = neigh_path.cost;// cost de a ajunge la vecin
            int new_cost = cost[nod] + c;
            if(new_cost < cost[neigh]){
                cost[neigh] = new_cost;
                if(!isInQueue[neigh]){
                    q.push(neigh);
                    isInQueue[neigh] = true;
                }
            }
        }
    }
}

void read(){
    int nod,cost,x;
    in >> n >>m >> s;
    for(int i = 1 ; i <= n ; i++){
        in >> Schizophrenia_lui_Zaharel[i];
    }
    for(int i = 1 ; i <= m;i++){
        in >>x >>  nod >> cost;
        v[x].push_back({nod,cost});
    }
}

bool check(){
    for(int i = 1; i <= n ; i ++){
        if(cost[i] != Schizophrenia_lui_Zaharel[i]){
            return false;
        }
    }
    return true;
}

void resetdata(){
    for (int i = 0; i <=n;i++){
        isInQueue[i]=false;
        v[i].clear();
    }
}

int main(){
    in >> t;
    for(int i = 0 ; i < t;i++){
        resetdata();
        read();
        Dijkstra(s);
        if (check()){
            out << "DA\n";
        }else{
            out << "NU\n";
        }
    }
}