Cod sursa(job #1189839)

Utilizator usermeBogdan Cretu userme Data 23 mai 2014 17:47:46
Problema Arbore partial de cost minim Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <vector>

using namespace std;

FILE*f=fopen("apm.in","r");
FILE*g=fopen("apm.out","w");

struct tip{
    int x,c;
};

vector<tip> v[200001];

tip rec[200001],d[200001];

int h[200001],si,n,m,poz[200001],s;

inline void schimb(int i,int j){
    int aux=h[i];
    h[i]=h[j];
    h[j]=aux;
    poz[h[i]]=i;
    poz[h[j]]=j;
}

void up(int x){
    while ( d[h[x]].c<d[h[(x+1)/3]].c&&x>1 ){
        schimb(x,(x+1)/3);
        x=(x+1)/3;
    }
}

void down(int x){
    int top=x*3-1,mid=x*3,bot=x*3+1,lane=x;
    if ( d[h[top]].c<d[h[lane]].c&&top<=si )lane=top;
    if ( d[h[mid]].c<d[h[lane]].c&&mid<=si )lane=mid;
    if ( d[h[bot]].c<d[h[lane]].c&&bot<=si )lane=bot;
    if ( lane==x )return;
    schimb(lane,x);
    down(lane);
}

void ins(int x){
    h[++si]=x;
    poz[x]=si;
    up(si);
    down(si);
}

void del(int x){
    schimb(x,si);
    --si;
    down(x);
}

void prim(){
    for ( int i=1;i<n;++i ){
        rec[i].x=d[h[1]].x;
        rec[i].c=h[1];
        int x=h[1];
        s+=d[h[1]].c;
        d[h[1]].c=-1001;
        del(1);
        for ( int j=0;j<v[x].size();++j ){
            if ( v[x][j].c<d[v[x][j].x].c&&d[v[x][j].x].c!=-1001 ){
                if ( d[v[x][j].x].c!=1001 ){
                    d[v[x][j].x].x=x;
                    d[v[x][j].x].c=v[x][j].c;
                    up(poz[v[x][j].x]);
                }
                else {
                    d[v[x][j].x].x=x;
                    d[v[x][j].x].c=v[x][j].c;
                    ins(v[x][j].x);
                }
            }
        }
    }
}

int main(){
    fscanf(f,"%d%d",&n,&m);
    for ( int i=1;i<=n;++i )
        d[i].c=1001;
    for ( int i=1;i<=m;++i ){
        int a,b,d;
        fscanf(f,"%d%d%d",&a,&b,&d);
        v[a].push_back({b,d});
        v[b].push_back({a,d});
    }
    for ( int i=0;i<v[1].size();++i ){
        d[v[1][i].x].x=1;
        d[v[1][i].x].c=v[1][i].c;
        ins(v[1][i].x);
    }
    rec[0].c=1;
    d[1].c=-1001;
    prim();
    fprintf(g,"%d\n%d\n",s,n-1);
    for ( int i=1;i<n;++i )
        fprintf(g,"%d %d\n",rec[i].x,rec[i].c);
    return 0;
}