Cod sursa(job #3321829)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 11 noiembrie 2025 13:38:22
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
//#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

int n, m, x, y, c;
int i;
int cost_total=0;
vector <int> tata;
vector<pair<int, int>> muchii_apcm;

struct Muchie{
    int x,y; //capetele muchiei
    int c; //costul muchiei

    bool operator<(const Muchie& other) const {
        return c < other.c;
    }
};

vector<Muchie> muchii;

void citire(){
    cin>>n>>m;
    for(i=1; i<= m; i++){
        cin>>x>>y>>c;
        muchii.push_back({x,y,c});
    }
}

void ordonare_muchii(){
    sort(muchii.begin(), muchii.end());
}

void initializare_tata(){
    tata.resize(n + 1);
    for(i=1; i<=n ;i++){
        tata[i]=i;
    }
}

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

void Union(int x, int y){
    int radacina_x = Find(x);
    int radacina_y = Find(y);
    if (radacina_x != radacina_y)
    {
        tata[radacina_x]=radacina_y;
    }
}

void Kruskal_APCM(){
    citire();
    ordonare_muchii();
    initializare_tata();

    for( const auto& muchie : muchii){
        int radacina_x= Find(muchie.x);
        int radacina_y= Find(muchie.y);

        if(radacina_x != radacina_y){
            cost_total+=muchie.c;
            muchii_apcm.push_back({muchie.x, muchie.y});
            Union(muchie.x, muchie.y);

            if(muchii_apcm.size() == n-1){
                break;
            }
        }
    }
}

void afisare(){
    cout<< cost_total<<endl;
    cout<<muchii_apcm.size()<<endl;

    for( const auto& muchie: muchii_apcm){
        cout<< muchie.first <<" "<<muchie.second<<endl;
    }
}

int main(){

    Kruskal_APCM();
    afisare();

    return 0;
}