Cod sursa(job #2503836)

Utilizator RadianElevenAdrian Ariotn RadianEleven Data 3 decembrie 2019 20:26:45
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda mirceaputemdadela8faraunsfert Marime 2.46 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

using namespace std;
ifstream f ("distante.in");
ofstream g ("distante.out");
int cost[50009];
int pct, edges;
queue<int> coada;
vector< pair <int, int> > muchii[50009];
struct Nod{
    int nod;
    int val;
};
Nod heap[500009];
int n, startnod;
Nod getMin()
{
    return heap[1];
}
void add(Nod x)
{

    n++;
    int poz=n;
    heap[n]=x;
    while(poz>1 && heap[poz/2].val>heap[poz].val)
    {
        swap(heap[poz/2], heap[poz]);
        poz/=2;
    }
}
int popMin()
{

    heap[1]=heap[n];
    heap[n]={0,0};
    int poz=1;
    n--;
    while(2*poz<=n)
    {
        poz*=2;
        if(poz<n && heap[poz].val>heap[poz+1].val) poz++;
        if(heap[poz].val < heap[poz/2].val)
            swap(heap[poz/2], heap[poz]);
        else poz=n;
    }
}

int num;
int o[50009];
int main()
{
    f>>num;
    for(int yy=1;yy<=num;++yy)
    {

        n=0;

        f>>pct>>edges>>startnod;
        for(int u=1;u<=pct;++u)
        {

            f>>o[u];
        }
        for(int i=1;i<=pct;++i)
        {
            muchii[i].clear();
        }
        for(int i=1;i<=edges;++i)
        {
            int c,b,a;
            f>>a>>b>>c;
            muchii[a].push_back(make_pair(b,c));
            muchii[b].push_back(make_pair(a,c));

        }
         for(int i=0;i<=pct;++i)
           cost[i]=1e9;
        Nod nod={startnod,0};
        cost[startnod]=0;
        add({startnod,0});
        while(n>0)
        {
            nod=getMin();
            popMin();
            if(nod.val<=cost[nod.nod])
            {
                cost[nod.nod]=nod.val;
                for(int i=0; i<muchii[nod.nod].size(); ++i)
                {

                    pair<int, int> copil=muchii[nod.nod].at(i);

                    Nod cop;
                    cop.nod=copil.first;
                    cop.val=copil.second+cost[nod.nod];
                    if(cost[copil.first]>cost[nod.nod]+copil.second)
                        add(cop);
                }
            }
        }
        bool sw=true;

        for(int i=1;i<=pct;++i)
        {
            if(cost[i]==1e9)
                cost[i]=0;
            if(cost[i]!=o[i])
               {
                   sw=false;
               break;
               }

        }
        if(sw)
            g<<"DA";
        else g<<"NU";
        g<<"\n";

    }


    return 0;
}