Cod sursa(job #2980392)

Utilizator xbornAvasilcai Andrei-Cristian xborn Data 16 februarie 2023 14:00:29
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m,r[200004],t[200004],s,cnt;
struct muchie
{
    int x,y,c;
}v[400004],sol[200005];
bool cmp(muchie a,muchie b)
{
    return a.c<b.c;
}
int find(int x)
{
    int rad=x;
    while(t[rad]!=0)
        rad=t[rad];
    int aux;
    while(t[x]!=0)
    {
        aux=t[x];
        t[x]=rad;
        x=aux;
    }
    return rad;
}
void unire(int x,int y)
{
    if(r[x]>r[y])
        t[y]=x;
    else
    {
        if(r[x]<r[y]) t[x]=y;
        else
        {
            t[y]=x;
            r[x]++;
        }
    }
}
void kruskal()
{
    for(int i=1;i<=m and cnt<n-1;i++)
    {
        int rad1,rad2;
        rad1=find(v[i].x);
        rad2=find(v[i].y);
        if(rad1!=rad2)
        {
            s+=v[i].c;
            sol[++cnt].x=v[i].x;
            sol[cnt].y=v[i].y;
            sol[cnt].c=v[i].c;
            unire(rad1,rad2);
        }
    }
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        fin>>v[i].x>>v[i].y>>v[i].c;
    }
    sort(v+1,v+m+1,cmp);
    kruskal();
    fout<<s<<'\n'<<cnt<<'\n';
    for(int i=1;i<=cnt;i++)
        fout<<sol[i].y<<' '<<sol[i].x<<'\n';
    return 0;
}