Cod sursa(job #2869844)

Utilizator Albert_GAlbert G Albert_G Data 11 martie 2022 21:14:28
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>

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

constexpr int INF = 1e9+1;
constexpr int N = 5e4+2;
int dist[N];

struct node{
    int v, cost;
};
std::vector<node> g[N];

void clearVect(int n){
    for(int i=1; i<=n; ++i)
        g[i].clear();
}

bool dijkstra(int source, int n){
    std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> heap;
    std::bitset<N> selected;
    int currDist[N];
    for(int i=1; i<=n; ++i)
        currDist[i] = INF;
    currDist[source] = 0;
    heap.push({0, source});
    int cnt = 0;
    while(!heap.empty()){
        int u = heap.top().second;
        heap.pop();
        if(selected[u]) continue;
        selected[u] = true;
        ++cnt;
        if(dist[u] != currDist[u]) return false;
        for(auto branch : g[u]){
            int v = branch.v;
            int cost = branch.cost;
            if(currDist[u] + cost < currDist[v]){
                currDist[v] = currDist[u] + cost;
                heap.push({currDist[v], v});
            }
        }
    }
    return cnt == n;
}

int main(){
    int t;
    in >> t;
    while(t--){
        int n, m, source;
        in >> n >> m >> source;
        for(int i=1; i<=n; ++i)
            in >> dist[i];
        for(int i=0; i<m; ++i){
            int u, v, cost;
            in >> u >> v >> cost;
            g[u].push_back({v, cost});
            g[v].push_back({u, cost});
        }
        bool res = dijkstra(source, n);
        if(res) out << "DA";
        else out << "NU";
        out << '\n';
        clearVect(n);
    }
    return 0;
}