Cod sursa(job #2566373)

Utilizator teomdn001Moldovan Teodor teomdn001 Data 2 martie 2020 20:55:12
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

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

const int MaxN = 100001;
const int MaxM = 400004;

struct Muchie{
    int x;
    int y;
    int cost;
}mu[MaxM], Rez[MaxM];

int n, m;
int Tata[MaxN], Rang[MaxM];

void Citire();
bool Compara(const Muchie &a, const Muchie &b);
int Radacina(int nod);
bool Unire(int x, int y);

int main()
{
    Citire();

    int cost_Total = 0, indice = 0;
    for (int i = 1; i <= m; ++i)
    {
        if (Unire(mu[i].x, mu[i].y))
        {
            Rez[++indice].x = mu[i].x;
            Rez[indice].y = mu[i].y;
            cost_Total += mu[i].cost;
        }
    }

    fout << cost_Total << '\n';
    fout << indice << '\n';
    for (int i = 1; i <= indice; ++i)
        fout << Rez[i].x << ' ' << Rez[i].y << '\n';
}

bool Unire(int x, int y)
{
    int rx = Radacina(x), ry = Radacina(y);
    if (rx != ry)
    {
        if (Rang[ry] > Rang[rx])
        {
            Tata[rx] = ry;
        }
        else
        {
            Tata[ry] = rx;
            if (Rang[rx] == Rang[ry])
                Rang[rx]++;
        }

        return true;
    }
    return false;
}

int Radacina(int nod)
{
    if (Tata[nod] == 0)
        return nod;
    else
    {
        int r = Radacina(Tata[nod]);
        Tata[nod] = r;
        return r;
    }
}

void Citire()
{
    fin >> n >> m;
    for (int i = 1; i <= m; ++i)
        fin >> mu[i].x >> mu[i].y >> mu[i].cost;

    sort(mu + 1, mu + m + 1, Compara);
}

bool Compara(const Muchie &a, const Muchie &b)
{
    return (a.cost < b.cost);
}