Cod sursa(job #2971679)

Utilizator Utucora2017Nicolae Utucora2017 Data 27 ianuarie 2023 19:56:41
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int main(){
    int n,m,s,t;
    cin>>t;
    for(int kk=1;kk<=t;kk++){
        int costverif[50001],dist[50001],viz[50001];
        cin>>n>>m>>s;
        vector<pair<int,int> > a[50001];
        for(int i=1;i<=n;i++)
            cin>>costverif[i];
        for(int i=1;i<=m;i++){
            int x,y,c;
            cin>>x>>y>>c;
            a[x].push_back(make_pair(c,y));
            a[y].push_back(make_pair(c,x));
        }
        priority_queue<pair<int,int> > q;
        for(int i=1;i<=n;i++)
            dist[i]=999999999,viz[i]=0;
        dist[s]=0;
        q.push(make_pair(0,s));
        while(!q.empty()){
            int nod=q.top().second;
            int costaj=dist[nod];
            q.pop();
            if(viz[nod]==0){
                viz[nod]=1;
                for(int i=0;i<a[nod].size();i++){
                    int vecin=a[nod][i].second;
                    if(costaj+a[nod][i].first<dist[vecin]){
                        dist[vecin]=costaj+a[nod][i].first;
                        q.push(make_pair(-dist[vecin],vecin));
                    }
                }
            }
        }
        int ok=0;
        for(int i=1;i<=n;i++)
            if(dist[i]!=costverif[i]){
                ok=1;
                break;
            }
        if(ok)
            cout<<"NU"<<"\n";
        else
            cout<<"DA"<<"\n";
    }
}