Cod sursa(job #2650192)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 17 septembrie 2020 17:57:02
Problema Arbore partial de cost minim Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("apm.in");
ofstream fout ("apm.out");

struct muchie
{
    int a, b, c;
}v[400001];

int comparare (muchie x, muchie y)
{
    return x.c<y.c;
}

int tt[200001], rg[200001], afis[200000];

int find(int x)
{
    int r, y;

    r=x;
    while(tt[r]!=r)
    {
        r=tt[r];
    }

    //aplic compresia drumurilor
    while(tt[x]!=x)
    {
        y=tt[x];
        tt[x]=r;
        x=y;
    }

    return r;
}

void unite (int x, int y)
{
    if(rg[y]<rg[x])
    {
        tt[y]=x;
    }

    else tt[x]=y;

    if(rg[x]==rg[y]) rg[y]++;
}


int main()
{
    int n, m, i, ct, k;
    fin>>n>>m;

    for(i=1; i<=m; i++)
    {
        fin>>v[i].a>>v[i].b>>v[i].c;
    }

    sort(v+1, v+m+1, comparare);

    for(i=1; i<=n; i++)
    {
        tt[i]=i;
        rg[i]=1;
    }

    ct=0;
    k=0;
    i=1;
    while(k<n-1)
    {
        if(find(v[i].a) != find(v[i].b) )
        {
            ct=ct+v[i].c;
            k++;
            afis[k]=i;

            unite(v[i].a, v[i].b);
        }

        i++;
    }

    fout<<ct<<"\n"<<n-1<<"\n";

    for(i=1; i<n; i++)
    {
        fout<<v[ afis[i] ].b<<' '<<v[ afis[i] ].a<<"\n";
    }

}