Cod sursa(job #3201833)

Utilizator raileanu-alin-gabrielRaileanu Alin-Gabriel raileanu-alin-gabriel Data 9 februarie 2024 20:25:21
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <vector>
#include <algorithm>
#define f first
#define s second
const int NMAX=200055;

using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");

struct edge
{
    int a, b, c;
    bool operator<(const edge& other) const
    {
        return c<other.c;
    }
};

vector <edge> mm;
vector <pair<int, int>> ans;
int n, m, t[NMAX], sz[NMAX];

int find(int);
bool un(int, int);
void apm();

int main()
{
    int i, a, b, c;
    cin>>n>>m;
    for(i=1; i<=n; i++)
    {
        t[i]=i;
        sz[i]=1;
    }
    for(i=1; i<=m; i++)
    {
        cin>>a>>b>>c;
        mm.push_back({a, b, c});
    }
    apm();
    return 0;
}

int find(int nod)
{
    if(t[nod]==nod) return nod;
    t[nod]=find(t[nod]);
    return t[nod];
}

bool un(int a, int b)
{
    a=find(a); b=find(b);
    if(a==b) return false;
    if(sz[a]>sz[b]) swap(a, b);
    t[a]=b;
    sz[b]+=sz[a];
    return true;
}

void apm()
{
    int cost=0;
    sort(mm.begin(), mm.end());
    for(auto i:mm)
    {
        if(un(i.a, i.b))
        {
            cost+=i.c;
            ans.push_back({i.a, i.b});
        }
    }
    cout<<cost<<'\n';
    cout<<ans.size()<<'\n';
    for(auto i:ans) cout<<i.f<<' '<<i.s<<'\n';
}