Cod sursa(job #2202111)

Utilizator lucia.cstCostache Lucia lucia.cst Data 7 mai 2018 16:31:59
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <algorithm>
using namespace std;

ifstream cin("apm.in");
ofstream cout("apm.out");

struct muchie
{
    int x,y,c;
}e[400005];

int t[200005], nrn[200005], m, n, c, x, y, selectat[400005];

bool cmp(muchie x, muchie y)
{
    return (x.c<y.c);
}

int radacina(int x)
{
    if(t[x]==0)
        return x;
    t[x]=radacina(t[x]);
    return t[x];
}

bool gaseste(int x, int y)
{
    return (radacina(x)==radacina(y));
}

void uniune(int x, int y)
{
    int rx=radacina(x);
    int ry=radacina(y);
    if(nrn[x]<nrn[y])
    {
        t[rx]=ry;
        nrn[ry]+=nrn[rx];
    }
    else
    {
        t[ry]=rx;
        nrn[rx]+=nrn[ry];
    }
}

void citire()
{
    cin>>n>>m;
    for(int i=1; i<=n; i++)
        nrn[i]=1;
    for(int i=1; i<=m; i++)
    {
        cin>>e[i].x>>e[i].y>>e[i].c;
    }

    sort(e+1, e+m+1, cmp);

    long long total=0;
    int muchii=0;

    for(int i=1; i<=m; i++)
    {
        if(!gaseste(e[i].x, e[i].y))
        {
            selectat[i]=true;
            total+=e[i].c;
            uniune(e[i].x, e[i].y);
        }

    }

    cout<<total<<'\n';

    for(int i=1; i<=m; i++)
        if(selectat[i])
            muchii++;
    cout<<muchii<<'\n';

    for(int i=1; i<=m; i++)
        if(selectat[i])
            cout<<e[i].y<<' '<<e[i].x<<'\n';

}


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