Cod sursa(job #2560297)

Utilizator TzigCurta Tudor Tzig Data 27 februarie 2020 21:21:41
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <vector>
#include <queue>

using namespace std;

ifstream f("distante.in");
ofstream g("distante.out");

const int NMAX = 50005;
const int INF = (int)1e18;

int T;
int D[NMAX];

struct Compara{
    bool operator()(int x,int y)
    {
        return D[x]>D[y];
    }
};

void Dijkstra(vector <pair <int,int> >X[],int NodStart,bool Viz[])
{
    priority_queue <int, vector <int>, Compara>Q;
    D[NodStart]=0;
    Viz[NodStart]=1;
    Q.push(NodStart);
    while(!Q.empty()){
        int Curent=Q.top();
        Viz[Curent]=0;
        Q.pop();
        for(unsigned int i=0;i<X[Curent].size();i++){
            int Vecin=X[Curent][i].first;
            int Cost=X[Curent][i].second;
            if(D[Vecin]>D[Curent]+Cost){
                D[Vecin]=D[Curent]+Cost;
                if(!Viz[Vecin]){
                    Viz[Vecin]=1;
                    Q.push(Vecin);
                }
            }
        }
    }
}

int main()
{
    f>>T;
    for(int test=1;test<=T;test++){
        int N,M,NodStart;
        f>>N>>M>>NodStart;
        int Dist[NMAX];
        for(int i=1;i<=N;i++){
            f>>Dist[i];
        }
        vector <pair <int,int> >X[NMAX];
        while(M){
            int i,j,c;
            f>>i>>j>>c;
            X[i].push_back(make_pair(j,c));
            X[j].push_back(make_pair(i,c));
            M--;
        }
        bool Viz[NMAX];
        for(int i=1;i<=N;i++){
            D[i]=INF;
            Viz[i]=0;
        }
        bool Ok=1;
        Dijkstra(X,NodStart,Viz);
        for(int i=1;i<=N;i++){
            if(Dist[i]!=D[i]){
                Ok=0;
                i=N;
            }
        }
        if(Ok){
            g<<"DA"<<'\n';
        }else{
            g<<"NU"<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}