Cod sursa(job #2884493)

Utilizator raul41917raul rotar raul41917 Data 3 aprilie 2022 20:21:01
Problema Distante Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <iostream>
#include <fstream>
#include <vector>
#define INF 2147483647
using namespace std;
ifstream fi("distante.in");
ofstream fo("distante.out");
int T;
vector <int>BRZ;
vector <pair<int,int> >V[50001];
vector <pair<int,int> > H;
int D[50001];
void rebuild()
{
    if(H.size()==1)
        H.pop_back();
    else
    {
        int last=H.size()-1;
        swap(H[last],H[0]);
        H.pop_back();
        int parent=0;
        int G=0;
        last--;
        while(G==0 && parent<=last)
        {
            cout<<3<<endl;
            int poz=parent;
            int child1=parent*2+1;
            int child2=parent*2+2;
            if(child1<=last)
                if(H[child1].second<H[poz].second)
                    poz=child1;
            if(child2<=last)
                if(H[child2].second<H[poz].second)
                    poz=child2;
            if(poz==parent)
            {
                G=1;
                continue;
            }else
            {
                swap(H[parent],H[poz]);
                parent=poz;
            }
        }
    }
}
void heapify()
{
    int child=H.size()-1;
    int G=0;
    while(child>0 && G==0)
    {
        int parent=(child-1)/2;
        cout<<2<<endl;
        if(H[parent].second>H[child].second)
        {
            swap(H[parent],H[child]);
            child=parent;
        }else
        {
            G=1;
            continue;
        }
    }
}
void Dijkstra()
{
    while(!H.empty())
    {
        int vertex=H[0].first;
        rebuild();
        for(int i=0;i<V[vertex].size();i++)
        {
            int vecin=V[vertex][i].first;
            if(D[vecin]>D[vertex]+V[vertex][i].second)
            {
                D[vecin]=D[vertex]+V[vertex][i].second;
                H.push_back(make_pair(vecin,D[vecin]));
                cout<<1<<endl;
                heapify();
            }
        }
    }
}
int main()
{
    fi>>T;
    for(int test=1;test<=T;test++)
    {
        int n,m,source;
        fi>>n>>m>>source;
        BRZ.clear();
        for(int i=1;i<=n;i++)
        {
            D[i]=INF;
            V[i].clear();
            int x;
            fi>>x;
            BRZ.push_back(x);
        }
        for(int i=1;i<=m;i++)
        {
            int nodeX,nodeY,C;
            fi>>nodeX>>nodeY>>C;
            V[nodeX].push_back(make_pair(nodeY,C));
            V[nodeY].push_back(make_pair(nodeX,C));
        }
        D[source]=0;
        H.push_back(make_pair(source,0));
        Dijkstra();
        int GG=0;
        for(int i=1;i<=n && GG==0;i++)
        {
            if(D[i]!=BRZ[i-1])
            {
                GG=1;
                continue;
            }
        }
        if(!GG)
            fo<<"DA"<<"\n";
        else
            fo<<"NU"<<"\n";
    }
    return 0;
}