Cod sursa(job #2665268)

Utilizator Nobody1Negru Mihai Nobody1 Data 30 octombrie 2020 14:40:56
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
#define INF INT_MAX
using namespace std;

const int Nmx = 101000;
int t, n, m, s,a ,b ,w, dist1[Nmx], dist[Nmx];
bool vis[Nmx];

vector<pair<int,int>> adj[Nmx];
priority_queue<pair<int,int>> q;

int main(){
    ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
    freopen("distante.in","r",stdin);
    freopen("distante.out","w",stdout);

    cin >> t;
    while(t--){
        cin >> n >> m >> s;
        bool politai = true;
        for(int i = 1; i <= n; i++) cin >> dist1[i];
        
        for(int i = 1; i <= m; i++){
            cin >> a >> b >> w;
            adj[a].push_back({b,w});
            adj[b].push_back({a,w});
        }

        for(int i = 1; i <= n; i++){ dist[i] = INF; vis[i] = false;}
        dist[s] = 0;

        q.push({0,s});
        while(!q.empty()){
            a = q.top().second; q.pop();
            if(vis[a]) continue;
            vis[a] = true;
            for(auto u : adj[a]){
                b = u.first; w = u.second;
                if(dist[a]+w < dist[b]){
                    dist[b] = dist[a]+w;
                    q.push({-dist[b],b});
                }
            }
        }
        
        for(int i = 1; i <= n; i++){
            adj[i].clear();
            if(dist1[i] != dist[i]) politai = false;
        }

        if(politai) cout << "DA\n";
        else cout << "NU\n";
    }
}