Cod sursa(job #2641698)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 12 august 2020 13:41:01
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <bits/stdc++.h>

using namespace std;

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

int t, n, m, s, a, b, c;

bool Dijkstra(vector <vector <pair <int, int> > > &G, vector <int> &dist, int s){
    vector <int> dp(n + 1, 1e9);
    set <pair <int, int> > heap;
    heap.insert({0, s});
    dp[s] = 0;
    while (heap.size()){
        auto it = heap.begin();
        int cost = (*it).first;
        int nod = (*it).second;
        heap.erase(it);
        if (dp[nod] != dist[nod]) return false;
        for (auto vecin : G[nod]){
            if (cost + vecin.second < dp[vecin.first]){
                if (dp[vecin.first] != 1e9) heap.erase(heap.find({dp[vecin.first], vecin.first}));
                dp[vecin.first] = cost + vecin.second;
                heap.insert({dp[vecin.first], vecin.first});
            }
        }
    }
    return true;
}

int main(){
    fin >> t;
    while (t--){
        fin >> n >> m >> s;
        vector <int> dist(n + 1);
        for (int i = 1; i <= n; ++i) fin >> dist[i];
        vector <vector <pair <int, int> > > G(n + 1);
        for (int i = 1; i <= m; ++i){
            fin >> a >> b >> c;
            G[a].push_back({b, c});
            G[b].push_back({a, c});
        }
        if (Dijkstra(G, dist, s)) fout << "DA\n";
        else fout << "NU\n";
    }
    return 0;
}