Cod sursa(job #3365802)

Utilizator cosmin.moiseMoise Cosmin Constantin cosmin.moise Data 24 septembrie 2026 19:01:30
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <algorithm>
#define NMAX 200002
#define MMAX 400002
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct Muchie 
{
    int x, y, c;
};
Muchie v[MMAX], sol[NMAX];
bool cmp(Muchie a, Muchie b) 
{
    return a.c < b.c;
}
int tata[NMAX], h[NMAX];
void Union(int rx,int ry) //regula de ponderare
{
    if(h[rx]>h[ry]) tata[ry]=rx;
    else if(h[rx]<h[ry]) tata[rx]=ry;
        else{
            tata[rx]=ry;
            h[ry]++;
        }
}
int find(int x) //returneaza rad arborelui in care se afla x
{
    int rad=x, y;
    while(tata[rad]) rad=tata[rad];
    while(x!=rad)
    {
        y=tata[x];
        tata[x]=rad;
        x=y;
    }
    return rad;
}

int main() 
{
    int n, m, rx,ry;
    fin >> n >> m;
    for (int i = 1; i <= m; i++)
        fin >> v[i].x >> v[i].y >> v[i].c;
    sort(v + 1, v + m + 1, cmp);

    int s = 0, nr = 0;
    for (int i = 1; i <= m; i++) 
    {
        int x = v[i].x;
        int y = v[i].y;
        rx=find(x);
        ry=find(y);
        if (rx!=ry) 
        {
            s += v[i].c;
            nr++; 
            sol[nr] = v[i];
            Union(rx,ry);
            if (nr == n - 1)
                break;
        }
    }
    fout << s << '\n';
    fout << nr << '\n';
    for (int i = 1; i <= nr; i++)
        fout << sol[i].x << ' ' << sol[i].y << '\n';
    return 0;
}