Cod sursa(job #345530)

Utilizator irene_mFMI Irina Iancu irene_m Data 3 septembrie 2009 15:00:40
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <cstdio>
#include <vector>
#define t(x)    ((x)/2)
#define fs(x)   ((x)*2)
#define fd(x)   ((x)*2+1)
#define MaxN 200009
#define MaxM 400009
#define MaxC 1009

using namespace std;

struct muchie {int a,b,c;} heap[MaxN];

vector <int> v[MaxN],cs[MaxN],x,y,nod;
int n,m,C,uz[MaxN],N;

void cit()
{
    int i,x,y,c;
    freopen("apm.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        v[x].push_back(y); cs[x].push_back(c);
        v[y].push_back(x); cs[y].push_back(c);
    }
}

void swap(int x,int y)
{
    muchie aux;
    aux=heap[x]; heap[x]=heap[y]; heap[y]=aux;
}

void urca(int nod)
{
    while(nod>1 && heap[t(nod)].c>heap[nod].c)
        swap(t(nod),nod), nod=t(nod);
}

void add(int x,int y,int cost)
{
    N++;
    heap[N].a=x; heap[N].b=y; heap[N].c=cost;
    urca(N);
}

void coboara(int nod)
{
    while((fs(nod)<=N && heap[fs(nod)].c<heap[nod].c) || (fd(nod)<=N && heap[fd(nod)].c<heap[nod].c))
        if(fd(nod)<=N)
        {
            if(heap[fs(nod)].c<heap[fd(nod)].c)
                swap(fs(nod),nod), nod=fs(nod);
            else
                swap(fd(nod),nod), nod=fd(nod);
        }
        else
            swap(fs(nod),nod), nod=fs(nod);
}

void sol()
{
    int nr,xi,yi,s,i;
    uz[1]=1; nod.push_back(1);
    for(i=0;i<v[1].size();i++)
        add(1,v[1][i],cs[1][i]);
    nr=1;
    while(nr<n)
    {
        xi=heap[1].a; yi=heap[1].b; s=heap[1].c;
        while(uz[yi])
        {
            heap[1]=heap[N]; heap[N].a=0; heap[N].b=0; heap[N].c=0; N--;
            coboara(1);
            xi=heap[1].a; yi=heap[1].b; s=heap[1].c;
        }
        x.push_back(xi); y.push_back(yi);
        C+=s;
        heap[1]=heap[N]; heap[N].a=0; heap[N].b=0; heap[N].c=0; N--;
        coboara(1);
        uz[yi]=1;
        for(i=0;i<v[yi].size();i++)
            if(!uz[v[yi][i]])
                add(yi,v[yi][i],cs[yi][i]);
        nr++;
    }
}



void afis()
{
    int i;
    freopen("apm.out","w",stdout);
    printf("%d\n",C);
    printf("%d\n",n-1);
    for(i=0;i<x.size();i++)
        printf("%d %d\n",x[i],y[i]);
}

int main()
{
    cit();
    sol();
    afis();
    return 0;
}