Cod sursa(job #681126)

Utilizator bogfodorBogdan Fodor bogfodor Data 16 februarie 2012 16:20:34
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define Nmax 400010
using namespace std;

FILE *fin=freopen("apm.in","r",stdin);
FILE *fout=freopen("apm.out","w",stdout);

int n,m,gr[Nmax],s;

struct muchie
{
    int x;
    int y;
    int c;
}g[Nmax];

bool cmp(muchie a, muchie b)
{
    return(a.c<b.c);
}

int grupa(int i)
{
    if(gr[i]==i)
        return i;
    gr[i]=grupa(gr[i]);
    return gr[i];
}

void citire()
{
    scanf("%d %d\n",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d\n",&g[i].x,&g[i].y,&g[i].c);
    }
}

vector <int> ind;

int main()
{
    citire();
    for(int i=1;i<=n;i++)
        gr[i]=i;
    sort(g+1,g+m+1,cmp);
    int nr=0;
    for(int i=1;i<=m && nr<=n-1;i++)
        if(grupa(g[i].x)!=grupa(g[i].y))
        {
            s+=g[i].c;
            ind.push_back(i);
            gr[grupa(g[i].x)]=grupa(g[i].y);
            nr++;
        }
    printf("%d\n%d\n",s,n-1);
    for (int i=0;i<n-1;i++)
        printf("%d %d\n",g[ind[i]].x,g[ind[i]].y);
    return 0;
}