Cod sursa(job #3136814)

Utilizator RORO123bBarbulescu Robert RORO123b Data 8 iunie 2023 18:09:48
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
//algoritmul Kruskal
#include <fstream>
#include <algorithm>

using namespace std;

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

const int N=2e5;
const int M=4e5;

struct muchie{
    int x,y,c;
}e[M];

int n,m, t[N+1], nr[N+1];
bool selectat[N+1];

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])
    {
        t[rx]=ry;
        nr[ry]+=nr[rx];
    }
    else
    {
        t[ry]=rx;
        nr[rx]+=nr[ry];
    }
}

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

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

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;
    }
    sort(e, e+m, cmp);
    int n_e=0,i=0,c_tot=0;
    while(n_e<n-1)
    {
        if(!interogare(e[i].x, e[i].y))
        {
            n_e++;
            reuniune(e[i].x,e[i].y);
            c_tot += e[i].c;
            selectat[i]=1;
        }
        i++;
    }
    fout<<c_tot<<'\n'<<n-1<<'\n';
    for(int i=0;i<m;i++)
    {
        if(selectat[i])
        {
            fout<<e[i].x<<' '<<e[i].y<<'\n';
        }
    }
    return 0;
}