Cod sursa(job #345497)

Utilizator irene_mFMI Irina Iancu irene_m Data 3 septembrie 2009 13:23:23
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <vector>
#define MaxN 200009
#define MaxM 400009
#define MaxC 1009

using namespace std;

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

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 cauta(int &xi,int &yi,int &s)
{
    int min=MaxC,i,j,X,Y;
    for(i=0;i<nod.size();i++)
    {
        X=nod[i];
        for(j=0;j<v[X].size();j++)
        {
            Y=v[X][j];
            if(!uz[Y] && cs[X][j]<min)
                xi=X, yi=Y, min=cs[X][j];
        }
    }
    s=min;
}

void sol()
{
    int nr,xi,yi,s;
    uz[1]=1; nr=1;
    nod.push_back(1);
    while(nr<n)
    {
        cauta(xi,yi,s);
        uz[yi]=1; nod.push_back(yi);
        C+=s;
        x.push_back(xi); y.push_back(yi);
        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;
}