Cod sursa(job #2867331)

Utilizator VladdalVVasile Vlad Raul VladdalV Data 10 martie 2022 12:03:20
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <stdbool.h>
#define N 200000
#define M 400000

using namespace std;

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

typedef struct
{
    int x, y, c;
} muchie;

int t[N+1], nr[N+1], n, m;
muchie e[M];
bool in_apm[M];

int cmp(const void *p1, const void *p2)
{
    muchie *e1 = (muchie*)p1;
    muchie *e2 = (muchie*)p2;
    return (e1->c  - e2->c);
}

int radacina(int x)
{
    if (t[x] == 0)
    {
        return x;
    }
    t[x] = radacina(t[x]);
    return t[x];
}

void reuniune(int x, int y)
{
    int rx = radacina(x);
    int ry = radacina(y);
    if (nr[rx] < nr[ry])
    {
        nr[ry] += nr[rx];
        t[rx] = ry;
    }
    else
    {
        nr[rx] += nr[ry];
        t[ry] = rx;
    }
}

bool verificare(int x, int y)
{
    return (radacina(x) == radacina(y));
}

int main()
{
    fin>>n>>m;
    for (int i = 1; i <= n; i++)
    {
        nr[i] = 1;
    }
    for (int i = 0; i < m; i++)
    {
        fin>>e[i].x>>e[i].y>>e[i].c;
    }
    qsort(e, m, sizeof(e[0]), cmp);
    int i = 0, nrm = 0, cost = 0;
    while (i < m && nrm < n - 1)
    {
        if (!verificare(e[i].x, e[i].y))
        {
            in_apm[i] = true;
            cost += e[i].c;
            reuniune(e[i].x, e[i].y);
            nrm++;
        }
        i++;
    }
    fout<<cost<<"\n"<<nrm<<"\n";
    for (int i = 0; i < m; i++)
    {
        if (in_apm[i])
        {
            fout<<e[i].x<<" "<<e[i].y<<"\n";
        }
    }
    return 0;
}