Cod sursa(job #2988482)

Utilizator alexcmeciu1Cmeciu Alexandru Cristian alexcmeciu1 Data 4 martie 2023 18:50:14
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,dp[50005],viz[50005],v[50005],k;
vector <pair<int,int>> lista[50005];
void citire(){
    for(int i=1;i<=n;i++)
        lista[i].clear(),viz[i]=0,v[i]=0;
    fin>>n>>m>>k;
    for(int i=1;i<=n;i++)
        fin>>v[i];
    for(int i=1;i<=m;i++){
        int x,y,cost;
        fin>>x>>y>>cost;
        lista[x].push_back({y,cost});
        lista[y].push_back({x,cost});
    }
}
void dijkstra(int start){
    priority_queue<pair<int,int>> q;
    for(int i=1;i<=n;i++)
        dp[i]=INT_MAX;
    q.push({0,start});
    dp[start]=0;
    while(!q.empty()){
        int x=q.top().second;
        q.pop();
        if(viz[x])continue;
        viz[x]=1;
        for(auto vecin:lista[x]){
                int cost=dp[x]+vecin.second;
                if(dp[vecin.first]>cost){
                    dp[vecin.first]=cost;
                    if(!viz[vecin.first]){
                    q.push({-dp[vecin.first],vecin.first});
                }
            }
        }
    }
}
int main()
{
    fin>>t;
    for(int i=1;i<=t;i++){
        citire();
        dijkstra(k);
        bool ok=true;
        for(int i=1;i<=n;i++){
            if(dp[i]!=v[i])
                ok=false,i=n;
        }
        if(ok==false)
            fout<<"NU"<<endl;
        else
            fout<<"DA"<<endl;
    }
    return 0;
}