Cod sursa(job #2284170)

Utilizator EdgeLordXDOvidiuPita EdgeLordXD Data 16 noiembrie 2018 22:06:08
Problema Distante Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 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
#define ll long long
ll M=0;
ll n,m,S,t;
ll b[4*N], c[N], r[N],nr=0, r2[N];
pair<ll, ll> a[4*N];
pair<ll, ll> h[4*N];
bool v[N];
bool verif(){
	for(int i=1; i<=n; ++i)
		if(r[i]!=r2[i])
			return 0;
	return 1;
}
void dij(){
    ll i,j,cur,k=0;
    while(h[0].f!=-M){
        i=h[0].s;
        cur=-h[0].f;
        h[0].f=-M;
        pop_heap(h,h+k+1);
        if(!v[i]){
            v[i]=1;
            r2[i]=cur;
            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);
                }
                j=b[j];
            }
        }
    }
}
void add(ll x, ll y, ll z){
    a[++nr].s=y;
    a[nr].f=z;
    b[nr]=c[x];
    c[x]=nr;
}
int main(){
    ll 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;
		dij();
        out<<( verif() ? "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(r2, 0, N);
        memset(v, 0, N);
    }
    return 0;
}