Cod sursa(job #2283957)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 16 noiembrie 2018 11:12:38
Problema Distante Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("distante.in");
ofstream out("distante.out");
#define N 50001
#define f first
#define s second
long long M=0;
int n,m,S,t;
int b[4*N], c[N], r[N],nr=0;
pair<int, int> a[4*N];
pair<int, int> h[4*N];
bool v[N];
bool dij(){
    int i,j,cur,k=1;
    while(h[0].f!=-M){
        i=h[0].s;
        cur=-h[0].f;
        h[0].f=-M;
        pop_heap(h,h+k);
        if(!v[i]){
            v[i]=1;
            if(r[i]!=cur)
                return 0;
            j=c[i];
            while(j){
                if(!v[a[j].s]){
                    h[k].s=a[j].s;
                    h[k].f=-(cur+a[j].f);
                    push_heap(h,h+k+1);
                    ++k;
                }
                j=b[j];
            }
        }
    }
    return 1;
}
void add(int x, int y, int z){
    a[++nr].s=y;
    a[nr].f=z;
    b[nr]=c[x];
    c[x]=nr;
}
int main(){
    int i,j,x,y,z;
    in>>t;
    while(t--){
        nr=0;
        M=1;
        in>>n>>m>>S;
        for(i=1; i<=n; ++i)
            in>>r[i];
        for(i=1; i<=m; ++i){
            in>>x>>y>>z;
            add(x,y,z);
            add(y,x,z);
            M+=z*1LL;
        }
        h[0].s=S;
        out<<( dij() ? "DA\n" : "NU\n");
        memset(a, 0, N*4);
        memset(h, 0, N*4);
        memset(b, 0, N*4);
        memset(c, 0, N);
        memset(r, 0, N);
        memset(v, 0, N);
    }
    return 0;
}