Cod sursa(job #2961126)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 5 ianuarie 2023 20:58:41
Problema Arbore partial de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

int N, M;
int costmin = 0, nrm = 0;

struct Muchie
{
    int x, y, cost;
    bool viz;
};

Muchie a[400000];
int t[200000];

void citire()
{
    fin >> N >> M;

    for (int i = 1; i <= M; i++)
    {
        fin >> a[i].x >> a[i].y >> a[i].cost;
    }
}

bool cmp(Muchie a, Muchie b)
{
    return a.cost < b.cost;
}

void Union(int a, int b)
{
    t[a] = b;
}

int Find(int x)
{
    int rad = x;
    while (t[rad] != 0)
    {
        rad = t[rad];
    }

    return rad;
}

void kruskal()
{
    int nrcc = N;
    sort(a + 1, a + M + 1, cmp);

    int radx, rady;
    for (int i = 1; i <= M && nrcc > 1; i++)
    {
        radx = Find(a[i].x);
        rady = Find(a[i].y);

        if (radx != rady)
        {
            Union(radx, rady);
            nrm++;
            nrcc -= 1;
            costmin += a[i].cost;

            a[i].viz = true;
        }
    }
}

void afisare()
{
    fout << costmin << '\n';
    fout << nrm << '\n';

    for (int i = 1; i <= M; i++)
    {
        if (a[i].viz == true)
        {
            fout << a[i].x << ' ' << a[i].y << '\n';
        }
    }
}

int main()
{
    citire();
    kruskal();
    afisare();

    fin.close();
    fout.close();

    return 0;
}