Cod sursa(job #2847595)

Utilizator andreimocianAndrei Mocian andreimocian Data 11 februarie 2022 08:47:09
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

struct muchie
{
    int x;
    int y;
    int cost;
};

int n, m, sol;
const int NMAX = 200005;
muchie e[2*NMAX];
int t[NMAX];
bool viz[NMAX];

void Union(int x, int y)
{
    t[x] = y;
}

int Find(int x)
{
    int radacina = x, aux;
    while(t[radacina] > 0)
    {
        radacina = t[radacina];
    }
    while(t[x] > 0)
    {
        aux = t[x];
        t[x] = radacina;
        x = aux;
    }
    return radacina;
}

void citire()
{
    int x, y, z;
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        fin >> x >> y >> z;
        e[i].x = x;
        e[i].y = y;
        e[i].cost = z;
    }
}

bool cmp(muchie e1, muchie e2)
{
    return e1.cost < e2.cost;
}

void apm()
{
    int cont = 0;
    sort(e + 1, e + m + 1, cmp);
    for(int i = 1; i <= m; i++)
    {
        int r1 = Find(e[i].x);
        int r2 = Find(e[i].y);
        if(r1 != r2)
        {
            sol += e[i].cost;
            Union(r1, r2);
            cont++;
            viz[i] = true;
        }
    }
    fout << sol << "\n" << cont << "\n";
    for(int i = 1; i <= m; i++)
    {
        if(viz[i])
        {
            fout << e[i].x << " " << e[i].y << "\n";
        }
    }
}

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