Cod sursa(job #2307547)

Utilizator rares1012Rares Cautis rares1012 Data 24 decembrie 2018 20:04:22
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

int dist[50000];

int best[50000];

std::vector<int> v[50000][2];

std::priority_queue< std::pair<int, int> > h;

void reset(){
    for(int i=0;i<50000;i++){
        best[i]=1;
        v[i][0].clear();
        v[i][1].clear();
    }
}

int check(int n){
    int x=1;
    for(int i=0;i<n;i++){
        if(-best[i]!=dist[i])
            x=0;
    }
    return x;
}

int main()
{
    int t,n,m,k,i,a,b,c,rsp,nd,val;
    FILE*fi,*fo;
    fi=fopen("distante.in","r");
    fo=fopen("distante.out","w");
    fscanf(fi,"%d",&t);
    for(int q=0;q<t;q++){
        reset();
        fscanf(fi,"%d%d%d",&n,&m,&k);
        k--;
        for(i=0;i<n;i++)
        {
            fscanf(fi,"%d",&dist[i]);
        }
        for(i=0;i<m;i++){
            fscanf(fi,"%d%d%d",&a,&b,&c);
            c=-c;
            a--;
            b--;
            v[a][0].push_back(b);
            v[a][1].push_back(c);
            v[b][0].push_back(a);
            v[b][1].push_back(c);
        }
        h.push({0,k});
        while(h.empty()==0){
            nd=h.top().second;
            if(best[nd]==1){
                val=h.top().first;
                best[nd]=val;
                for(i=0;i<v[nd][0].size();i++){
                    h.push({v[nd][1][i] + val, v[nd][0][i]});
                }
            }
            h.pop();
        }
        rsp=check(n);
        if(rsp==1)
            fprintf(fo,"DA\n");
        else fprintf(fo,"NU\n");
    }
    fclose(fi);
    fclose(fo);
    return 0;
}