Cod sursa(job #2833622)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 15 ianuarie 2022 14:09:00
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("distante.in");
ofstream fout("distante.out");
const int NMAX=50005;
const int inf=2e9;

int T, N, M, sol[NMAX], dp[NMAX];
struct element{
    int nod, cost;
};
struct compare{
    bool operator()(element &A, element &B){
        return A.cost>B.cost;
    }
};

bool Dijkstra(int sursa, vector<element> g[NMAX])
{
    priority_queue<element,vector<element>,compare> q;
    for(int i=1;i<=N;i++)
        dp[i]=inf;
    dp[sursa]=0;
    q.push({sursa,0});
    element x;
    while(!q.empty()){
        x=q.top();
        q.pop();
        if(x.cost!=dp[x.nod]) continue;
        for(auto nxt: g[x.nod]){
            if(dp[nxt.nod]>dp[x.nod]+nxt.cost){
                dp[nxt.nod]=dp[x.nod]+nxt.cost;
                q.push({nxt.nod,dp[nxt.nod]});
            }
        }
    }
    for(int i=1;i<=N;i++)
        if(sol[i]!=dp[i])
            return false;
    return true;
}

int main()
{
    fin>>T;
    int sursa, x, y, cost;
    while(T--){
        vector<element> g[NMAX];
        fin>>N>>M>>sursa;
        for(int i=1;i<=N;i++)
            fin>>sol[i];
        for(int i=1;i<=M;i++){
            fin>>x>>y>>cost;
            g[x].push_back({y,cost});
            g[y].push_back({x,cost});
        }
        if(Dijkstra(sursa,g))
            fout<<"DA"<<'\n';
        else
            fout<<"NU"<<'\n';
    }

    fin.close();
    fout.close();
    return 0;
}