Cod sursa(job #3325744)

Utilizator justy41Babiciu Iustin justy41 Data 26 noiembrie 2025 11:28:56
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");

#define NMAX 200001

int tata[NMAX];
int rang[NMAX];
int cost;
vector<pair<int, pair<int, int>>> G;
vector<pair<int, int>> muchii;

int radacina(int k) {
    if(tata[k] == k) {
        return k;
    }

    return tata[k] = radacina(tata[k]);
}

void unire(int k, int p) {
    if(rang[k] < rang[p]) {
        tata[k] = p;
    }
    else {
        tata[p] = k;
        if(rang[k] == rang[p]) {
            rang[p]++;
        }
    }
}

void kruskal(int n, int m) {
    for(int i = 1; i<=n; i++) {
        tata[i] = i;
        rang[i] = 1;
    }

    sort(G.begin(), G.end());

    for(int i = 0; i<m; i++) {
        int x = G[i].second.first;
        int y = G[i].second.second;
        int rad1 = radacina(x);
        int rad2 = radacina(y);
        if(rad1 != rad2) {
            cost += G[i].first;
            muchii.push_back({x, y});
            unire(rad1, rad2);
        }
    }
}

int main() {
    int n, m, c, x, y;
    fin>>n>>m;

    for(int i = 0; i<m; i++) {
        fin>>x>>y>>c;
        G.push_back({c, {x, y}});
    }

    kruskal(n, m);

    fout<<cost<<'\n'<<muchii.size()<<'\n';
    for(auto it : muchii) {
        fout<<it.first<<" "<<it.second<<'\n';
    }

    return 0;
}