Cod sursa(job #3364849)

Utilizator Andreea1501013Andreea Andreea1501013 Data 12 septembrie 2026 13:11:56
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;
int N,M;
int tata[200005];
struct graf
{
    int nod1,nod2,cost;
};
graf muchii[400005];

bool cmp(graf a, graf b)
{
    return a.cost < b.cost;
}

void initPaduri()
{
    for(int i = 1; i<=N; i++)
    {
        tata[i] = i;
    }
}

int getTata(int nod)
{
    if(tata[nod] != nod)
    {
        tata[nod] = getTata(tata[nod]);
    }
    return tata[nod];
}

int main()
{
    ifstream cin("apm.in");
    ofstream cout("apm.out");
    long long sum = 0;
    vector<pair<int,int>> sol;

    cin>>N>>M;
    for(int i=1; i<=M; i++)
    {
        cin>>muchii[i].nod1>>muchii[i].nod2>>muchii[i].cost;
    }

    sort(muchii + 1, muchii + M + 1,cmp);

    initPaduri();
    for(int i = 1; i <= M; i++)
    {
        ///verificam daca putem pune muchia (trebuie sa nu se formeze un ciclu)
        /// verificam prin paduri de multimi disjuncte
        getTata(muchii[i].nod1);
        getTata(muchii[i].nod2);
        if(tata[muchii[i].nod1] != tata[muchii[i].nod2])
        {
            /// se poate pune muchia
            sum += muchii[i].cost;
            tata[tata[muchii[i].nod2]] = tata[muchii[i].nod1];
            sol.push_back({muchii[i].nod1, muchii[i].nod2});
        }
    }
    cout<<sum<<'\n';
    cout<<sol.size()<<'\n';
    for(auto it:sol)
    {
        cout<<it.first<<' '<<it.second<<'\n';
    }
    return 0;
}