Cod sursa(job #2103541)

Utilizator andrei32576Andrei Florea andrei32576 Data 10 ianuarie 2018 14:34:07
Problema Arbore partial de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<fstream>
using namespace std;

int n,m,i,j,l,x,y,c,vf,ct,nd;
int d[200005],H[200005],p[200005],t[200005];
struct nod
{
    int x,c;
    nod *urm;
};
nod *gr[200005],*q;
int inf=2000000000;
struct solutie
{
    int x,y;
};
solutie sol[200005];

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

void adaug(int x,int y,int c)
{
    nod *p=new nod;
    p->x=y;
    p->c=c;
    p->urm=gr[x];
    gr[x]=p;
}

void up(int k)
{
    while(k>1 && d[H[k]]<d[H[k/2]])
    {
        swap(H[k],H[k/2]);
        swap(p[H[k]],p[H[k/2]]);
        k=k/2;
    }
}

void down(int k)
{
    int tata=k,fiu=2*k;
    while(fiu<=l)
    {
        if(fiu+1<=l && d[H[fiu]]>d[H[fiu+1]]) fiu++;
        if(d[H[tata]]>d[H[fiu]])
        {
            swap(H[tata],H[fiu]);
            swap(p[H[tata]],p[H[fiu]]);
            tata=fiu;
            fiu=2*tata;
        }
        else fiu=l+1;
    }
}


void creareHeap(int vf)
{
    H[++l]=vf;
    p[vf]=l;
    up(l);
}

int extMin()
{
    int vf=H[1];
    swap(H[1],H[l]);
    swap(p[H[1]],p[H[l]]);
    l--;
    down(1);
    p[vf]=0;
    return vf;
}

int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y>>c;
        adaug(x,y,c);
        adaug(y,x,c);
    }

    for(i=1;i<=n;i++)
        d[i]=inf;
    d[1]=0;
    t[1]=0;
    for(q=gr[1];q!=NULL;q=q->urm)
    {
        d[q->x]=q->c;
        t[q->x]=1;
    }

    for(i=2;i<=n;i++)
        creareHeap(i);

    ct=0;
    for(i=1;i<=n-1;i++)
    {
        vf=extMin();

        for(q=gr[vf];q!=NULL;q=q->urm)
        {
            if(d[q->x]>q->c)
            {
                d[q->x]=q->c;
                t[q->x]=vf;
            }
        }

        ct+=d[vf];
        sol[i].x=vf;
        sol[i].y=t[vf];

        for(q=gr[vf];q!=NULL;q=q->urm)
        {
            if(p[q->x]!=0) up(p[q->x]);
        }
    }

    g<<ct<<"\n";
    g<<n-1<<"\n";
    for(i=1;i<=n-1;i++)
       g<<sol[i].x<<" "<<sol[i].y<<"\n";

    f.close();
    g.close();
    return 0;
}