Cod sursa(job #2971591)

Utilizator carinamariaCarina Maria Viespescu carinamaria Data 27 ianuarie 2023 17:48:52
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <cstring>
#include <set>
#include <climits>
#include <vector>
using namespace std;
ifstream cin("distante.in");
ofstream cout("distante.out");
int i, j, n, m, k, x, y, ok, t, sursa, cost;
int d[50002], dist[50002];
vector <pair<int, int>> L[50002];
void dijsktra(int sursa){
    for(int i=1;i<=n;i++)
        dist[i]=INT_MAX;
    dist[sursa]=0;
    set<pair<int, int>> s;
    s.insert({0, sursa});
    while(!s.empty()){
        int nod=s.begin()->second;
        s.erase(s.begin());
        for(int i=0;i<L[nod].size();i++){
            int vecin=L[nod][i].first;
            int cost=L[nod][i].second;
            if(dist[vecin]>dist[nod]+cost){
                s.erase({dist[vecin], vecin});
                dist[vecin]=dist[nod]+cost;
                s.insert({dist[vecin], vecin});
            }
        }
    }
}
int main() {
    cin>>t;
    while(t--){
        cin>>n>>m>>sursa;
        for(i=1;i<=n;i++){
            cin>>d[i];
        }
        for(i=1;i<=m;i++){
            cin>>x>>y>>cost;
            L[x].push_back({y, cost});
            L[y].push_back({x, cost});
        }
        dijsktra(sursa);
        ok=1;
        for(i=1;i<=n;i++){
            if(dist[i]!=d[i]){
                ok=0;
                break;
            }
        }
        if(ok==0)
            cout<<"NU"<<"\n";
        else
            cout<<"DA"<<"\n";
    }



}