Cod sursa(job #2841441)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 29 ianuarie 2022 18:50:10
Problema Distante Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.36 kb
#include <bits/stdc++.h>
#define nmax 500001
using namespace std;

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

struct ed
{
    int e,c;
    ed(int e=0,int c=0)
    {
        this->e=e;
        this->c=c;
    }
};

vector<ed> adj[nmax]; //de ref
int n,m,s;
int h[nmax],k;
int poz[nmax];
int dij[nmax],val[nmax];

int v[nmax];


void swp(int a, int b)
{
    poz[h[a]]=b;
    poz[h[b]]=a;
    int aux=h[a];
    h[a]=h[b];
    h[b]=aux;
}

void upheap(int nod)
{
    if(nod==1) return;
    if(val[h[nod]]<val[h[nod/2]])
    {
        swp(nod,nod/2);
        upheap(nod/2);
    }
}

void downheap(int nod)
{
    if(nod*2+1<=k)
    {
        if(val[h[nod*2+1]]<val[h[nod*2]]&&val[h[nod]]>val[h[nod*2+1]])
        {
            swp(nod,nod*2+1);
            downheap(nod*2+1);
        }
        else if(val[h[nod*2+1]]>=val[h[nod*2]]&&val[h[nod]]>val[h[nod*2]])
        {
            swp(nod,nod*2);
            downheap(nod*2);
        }
    }
    else if(nod*2<=k&&val[h[nod]]>val[h[nod*2]])
        swp(nod,nod*2);
}




void dk(int st)
{
    k=0;
    for(int i=1;i<=n;i++)
    {
        val[i]=INT_MAX;
        poz[i]=-1;
        dij[i]=INT_MAX;
    }
    k++;
    val[st]=0;
    poz[st]=1;
    h[1]=st;
    while(val[h[1]]!=INT_MAX)
    {
        //cout<<"here"<<' '<<arb[1]<<'\n';
        int c=h[1];
        dij[c]=val[c];
        val[c]=INT_MAX;
        downheap(1);
        for(auto e:adj[c])
        {
            if(dij[e.e]==INT_MAX&&val[e.e]>dij[c]+e.c)
            {
                if(poz[e.e]==-1)
                {
                    k++;
                    poz[e.e]=k;
                    h[k]=e.e;
                }
                val[e.e]=dij[c]+e.c;
                upheap(poz[e.e]);
            }
        }
    }
}


int main()
{
    int t; f>>t;
    while(t--)
    {
        f>>n>>m>>s;
        for(int i=1;i<=n;i++)
        {
            adj[i].clear();
            f>>v[i];
        }
        for(int i=0;i<m;i++)
        {
            int a,b,c;
            f>>a>>b>>c;
            adj[a].push_back(ed(b,c));
            adj[b].push_back(ed(a,c));
        }
        dk(s);
        bool ok=1;
        for(int i=1;i<=n;i++)
        {
            if(v[i]!=dij[i]) ok=0;
        }
        if(ok) g<<"DA\n";
        else g<<"NU\n";
    }
    return 0;
}