Cod sursa(job #2263774)

Utilizator elenaisaiaElena Isaia elenaisaia Data 19 octombrie 2018 11:30:05
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define pb push_back

using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m,gr[200001],cost=0;

struct muchie
{
    int x,y;
};

struct nod
{
    int c;
    muchie m;
};

vector <muchie> S;
vector <nod> V;

bool op(nod x,nod y)
{
    return x.c<y.c;
}

void citire()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        gr[i]=i;
    for(int i=1;i<=m;i++)
    {
        nod a;
        fin>>a.m.x>>a.m.y>>a.c;
        V.pb(a);
    }
    sort(V.begin(),V.end(),op);
}

int grupa(int i)
{
    int R,y;
    for(R=i;gr[R]!=R;R=gr[R]);
    for(;gr[R]!=i;)
    {
        y=gr[i];
		gr[i]=R;
		i=y;
    }
    return R;
}

void reuniune(int i, int j)
{
    gr[grupa(i)]=grupa(j);
}

void rez()
{
    int mini,maxi;
    int i=1;
    for(auto&v:V)
    {
        if(i>n-1)
            return;
        if(grupa(v.m.x)!=grupa(v.m.y))
        {
            reuniune(v.m.x,v.m.y);
            S.pb(v.m);
            cost+=v.c;
            i++;
        }
    }
}

void afish()
{
    fout<<cost<<"\n"<<n-1<<"\n";
    for(auto&v:S)
        fout<<v.x<<" "<<v.y<<"\n";
}

int main()
{
    citire();
    rez();
    afish();
    return 0;
}