Cod sursa(job #2139635)

Utilizator andrei32576Andrei Florea andrei32576 Data 22 februarie 2018 17:56:54
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include<fstream>
using namespace std;

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

struct solutie
{
    int x,y;
};
solutie sol[200005];

ifstream f("date.in");
ofstream g("date.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 swap(int i,int j)
{
    int aux;
    aux=H[i];H[i]=H[j];H[j]=aux;
    aux=p[H[i]];p[H[i]]=p[H[j]];p[H[j]]=aux;
}

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

            tata=fiu;
            fiu=2*tata;
        }
        else fiu=m+1;
    }
}

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

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

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;

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

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

    ct=0;
    for(i=1;i<n;i++)
    {
        nd=H[1];
        swap(1,m);
        m--;
        down(1);
        p[nd]=0;

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

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

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

    }

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

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