Cod sursa(job #2918848)

Utilizator BlueLuca888Girbovan Robert Luca BlueLuca888 Data 13 august 2022 15:12:47
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")

using namespace std;

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

const string msg[2] = {"NU", "DA"};
const int INF = 2e9;
const int MAX_N = 50005;
int n, m, nodSTART, a, b, c;
int input[MAX_N], dist[MAX_N];
bool same;
vector <pair<int, int>> e[MAX_N];

int crt, nxt, cst;
set<pair<int, int>> best;
bitset <MAX_N> viz;
void dijkstra(int start){
    for(int i=1; i<=n; i++){
        viz[i] = false;
        dist[i] = INF;
    }

    dist[start] = 0;
    best.insert({dist[start], start});
    while(!best.empty()){
        crt = best.begin()->second;
        best.erase(best.begin());

        if(!viz[crt])
            for(int i=0; i < (int)e[crt].size(); i++){
                nxt = e[crt][i].first;
                cst = e[crt][i].second;
                if(dist[nxt] > dist[crt] + cst){
                    dist[nxt] = dist[crt] + cst;
                    best.insert({dist[nxt], nxt});
                }
            }
        viz[crt] = true;
    }
}

int main (){
    ios_base::sync_with_stdio(false);
    fin.tie(nullptr), fout.tie(nullptr);

    int teste;
    fin>>teste;
    while(teste--){
        fin>>n>>m>>nodSTART;
        for(int i=1; i<=n; i++)
            fin>>input[i];
        for(int i=1; i<=m; i++){
            fin>>a>>b>>c;
            e[a].push_back({b, c});
        }

        dijkstra(nodSTART);

        same = true;
        for(int i=1; i<=n; i++)
            if(input[i] != dist[i]){
                same = false;
                break;
            }
        fout<<msg[same]<<"\n";
    }
    return 0;
}