Cod sursa(job #1917384)

Utilizator duesakBourceanu Cristian duesak Data 9 martie 2017 12:07:58
Problema Distante Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fin("distante.in");
ofstream fout("distante.out");
int vl[50002];
int evl[50002];
int nrnd[50002];
int hp[100002];
int inf=1<<30;
struct ad{
    int nda,val;
};
int lhp=0;
vector<ad>g[50002];
int extract(){
    int ex=hp[1],aux,i=1;
    hp[i]=hp[lhp];
    nrnd[hp[i]]=i;
    lhp--;
    while((i<<1<=lhp&&vl[hp[i]]>vl[hp[i<<1]])||((i<<1)+1<=lhp&&vl[hp[i]]>vl[hp[i<<1]])){
        if(vl[hp[i]]>vl[hp[i<<1]]&&(vl[hp[i<<1]]<vl[hp[(i<<1)+1]]||(i<<1)+1>lhp)){
            aux=hp[i];
            hp[i]=hp[i<<1];
            hp[i<<1]=aux;
            nrnd[hp[i<<1]]=i<<1;
            nrnd[hp[i]]=i;
        }
        else{
            aux=hp[i];
            hp[i]=hp[(i<<1)+1];
            hp[(i<<1)+1]=aux;
            nrnd[hp[(i<<1)+1]]=(i<<1)+1;
            nrnd[hp[i]]=i;
        }
    }
    nrnd[ex]=0;
    return ex;
}
void insertheap(int elem){
    ++lhp;
    hp[lhp]=elem;
    nrnd[elem]=lhp;
    int n=lhp,aux;
    while(n>1){
        if(vl[hp[n]]<vl[hp[n>>1]]){
            aux=hp[n];
            hp[n]=hp[n>>1];
            hp[n>>1]=aux;
            nrnd[hp[n]]=n;
            nrnd[hp[n>>1]]=n>>1;
        }
        n>>=1;
    }
}
void updateheap(int n){
    int aux;
    while(n>1){
        if(vl[hp[n]]<vl[hp[n>>1]]){
            aux=hp[n];
            hp[n]=hp[n>>1];
            hp[n>>1]=aux;
            nrnd[hp[n]]=n;
            nrnd[hp[n>>1]]=n>>1;
        }
        n>>=1;
    }
}
int main(){
    int n,m,i,a,b,c,t,tc,s;
    bool ok;
    ad aux;
    int nod;
    fin>>t;
    for(tc=1;tc<=t;tc++){
    fin>>n>>m>>s;
    for(i=1;i<=n;i++)
        fin>>evl[i];
    for(i=1;i<=n;i++)
        vl[i]=inf;
    vl[s]=0;
    for(i=1;i<=n;i++)
        g[i].clear();
    for(i=1;i<=m;i++){
        fin>>a>>b>>c;
        if(a!=b){
            aux.nda=b;
            aux.val=c;
            g[a].push_back(aux);
            aux.nda=a;
            aux.val=c;
            g[b].push_back(aux);
        }
    }
    insertheap(s);
    while(lhp){
        nod=extract();
        for(i=0;i<g[nod].size();i++)
            if(g[nod][i].val+vl[nod]<vl[g[nod][i].nda]){
                    vl[g[nod][i].nda]=g[nod][i].val+vl[nod];
                    if(nrnd[g[nod][i].nda])updateheap(nrnd[g[nod][i].nda]);
                    else insertheap(g[nod][i].nda);
            }
    }
    ok=true;
    for(i=1;i<=n;i++)
        if(evl[i]!=vl[i]){ok=false;break;}
    if(ok)fout<<"DA"<<'\n';
    else fout<<"NU"<<'\n';
    }
    fin.close();
    fout.close();
    return 0;
}