Cod sursa(job #2842162)

Utilizator Abramiuc_AndreiAbramiuc Andrei Abramiuc_Andrei Data 31 ianuarie 2022 11:02:02
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.34 kb
#include <iostream>
#include <vector>
#include <fstream>
#define NMAX 200010
#define MMAX 400010
#define inf 2100000000
#define pb push_back
#define mkp make_pair
using namespace std;
ifstream fin(".in");
ofstream fout(".out");
struct arb{
int nod,val;
}heap[NMAX];

int n,m,lheap;
int poz[NMAX],viz[NMAX];//poz in heap

void introd_heap(int node,int valoare)
{
    lheap++;
    heap[lheap].nod=node;
    heap[lheap].val=valoare;
    poz[node]=lheap;//initializam in heap primul nod si retinem pozitia lui in heap
}

void upheap(int p,int valoare)
{
    int index=p;
    heap[index].val=valoare;

    while(index/2>=1 && heap[index]<heap[index/2])
    {
        //urcam nodul cat mai sus cat timp este mai mic decat parintele
        swap(poz[heap[index].nod],poz[heap[index/2].nod]);
        swap(heap[index],heap[index/2]);
        index=index/2;
    }
}

void downHeap()
{
    int index=1;
    while(2*index<=lheap)
    {
        int minIndex=index;
        //stabilim minimul intre stanga si dreapta(daca exista)
        if(heap[2*index]<heap[index])
        {
            minIndex=2*index;
        }
        if(2*index+1<=lheap && heap[2*index+1]<heap[minIndex])
            minIndex=2*index+1;

        if(minIndex!=index)
        {
            swap(poz[heap[index].nod],poz[heap[minIndex]].nod);
            swap(heap[index],heap[minIndex]);
            index=minIndex;
        }
        else
            index=lheap*4;//stop
    }
}

arb getEilmVarf()
{
    arb x=heap[1];
    poz[heap[lheap].nod]=1;
    //heap[1].nod=heap[lheap].nod;
    //heap[1].val=heap[lheap].val;
    swap(heap[1],heap[lheap]);
    lheap--;

    downHeap();

    return x;
}

long long cost;
vector <pair<int,int>> muc[NMAX];
int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y,c;
        fin>>x>>y>>c;
        muc[x].pb(mkp(y,c));
        muc[y].pb(mkp(x,c));
    }

    introd_heap(1,0);
    for(int i=2;i<=n;i++)
        introd_heap(i,inf);//initializam toate celelalte noduri in heap cu inf

    for(int i=1;i<n;i++)
    {
        arb xmin=getElimVarf();

        cost+=xmin.val;
        viz[xmin.nod]=1;

        for(int i=0;i<muc[xmin.nod].size();i++)
        {
            int dest;
            if(viz[]==0 && heap[poz].val>muchie.val)
        }

    }
    return 0;
}