Cod sursa(job #3265264)

Utilizator Dogo123Alessandro Dogaru Dogo123 Data 28 decembrie 2024 14:48:12
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include<fstream>
#include <queue>
#include<vector>
#include <utility>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");

int main() {
    int  t;
    cin>>t;
    for (int i=1;i<=t;i++) {
        int n,m,s;
        cin>>n>>m>>s;
        vector<int> verify(n+1);
        for (int j=1;j<=n;j++) {
            cin>>verify[j];
        }
        vector<vector<pair<int,int>>>adi(n+1);
        while (m) {
            int srs,dest,cost;
            cin>>srs>>dest>>cost;
            adi[srs].emplace_back(cost,dest);
            adi[dest].emplace_back(cost,srs);
            m--;
        }
        priority_queue<pair<int,int>,vector<pair<int,int>>, greater<>> pq;
        pq.push(make_pair(0,s));
        vector<int> result(n+1,-1);
        result[s]=0;
        vector<bool>vizitat(n+1,false);
        while (!pq.empty()) {
            auto curent=pq.top();
            pq.pop();
            if (vizitat[curent.second])continue;
            vizitat[curent.second]=true;
            for (auto vecin: adi[curent.second]) {
                if (result[vecin.second]==-1 || curent.first+vecin.first<result[vecin.second]) {
                    result[vecin.second]= curent.first+vecin.first;
                    pq.emplace(result[vecin.second],vecin.second);

                }
            }
        }
        bool ok=true;
        for (int f=1;f<=n;f++) {
            if (verify[f]!=result[f])ok=false;
        }
        if (ok) {
            cout<<"DA"<<endl;
        }
        else cout<<"NU"<<endl;



    }
    return 0;
}