Cod sursa(job #2544946)

Utilizator radugnnGone Radu Mihnea radugnn Data 12 februarie 2020 18:24:36
Problema Distante Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
#define INF 1000000000
#define DIM 50010
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int T,n,m,rad,a,b,c,i,ok;
int D[DIM],sol[DIM];
vector < pair<int,int> > L[DIM];
set < pair<int,int> > S;
void initializare(){
    for(int i=1;i<=50001;i++){
        if(!L[i].empty())
            L[i].clear();
    }
    for(int i=1;i<=n;i++)
        D[i]=INF;
    D[rad]=0;
    ok=1;
}
void dijkstra(){
    S.insert({0,rad});
    while(!S.empty()){
        int nod=S.begin()->second;
        S.erase(S.begin());
        for(i=0;i<L[nod].size();i++){
            int vecin=L[nod][i].first;
            int cost=L[nod][i].second;
            if(D[vecin] > D[nod]+cost){
                S.erase({D[vecin],vecin});
                D[vecin]=D[nod]+cost;
                S.insert({D[vecin],vecin});
            }
        }
    }
}
int main(){
    fin>>T;
    while(T--){
        fin>>n>>m>>rad;
        for(i=1;i<=n;i++)
            fin>>sol[i];
        initializare();
        for(i=1;i<=m;i++){
            fin>>a>>b>>c;
            L[a].push_back({b,c});
        }
        dijkstra();
        for(i=1;i<=n;i++)
            if(D[i]!=sol[i])
                ok=0;
        if(ok)
            fout<<"DA"<<"\n";
        else
            fout<<"NU"<<"\n";
    }
    return 0;
}