Cod sursa(job #3337050)

Utilizator anon123andrei popescu anon123 Data 26 ianuarie 2026 21:25:30
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");

struct Edge {
    int u,v,cost;
    bool operator<(const Edge& other) const {
        return cost < other.cost;
    }
};
vector<int> rep;
int find(int i) {
    if (rep[i] == i) {
        return i;
    }
    return rep[i] = find(rep[i]);
}
void unite(int x, int y) {
    int rootx = find(x);
    int rooty = find(y);
    rep[rooty] = rootx;
}
int main(){
    int n,m;
    fin >> n>>m;
    vector<Edge> muchii;
    vector<Edge> rez;
    rep.resize(n+1);
    int costtotal=0;

    for (int i = 0;i<m;i++) {
        int u,v,c;
        fin>>u>>v>>c;
        muchii.push_back({u,v,c});
    }
    for (int i = 1; i<=n; i++) {
        rep[i] = i;
    }
    priority_queue< tuple<int,int,int>, vector<tuple<int,int,int>>, greater<> > pq; // cost, nod, tata
    for (auto e : muchii) {
        pq.emplace(e.cost, e.u, e.v);
    }
    while (!pq.empty()) {
        auto [cost, u, v] = pq.top();
        pq.pop();
        if (find(u) != find(v)) {
            unite(u,v);
            rez.push_back({u,v,cost});
            costtotal+=cost;
        }

    }

    fout<<costtotal<<endl;
    for (auto r : rez) {
        fout<<r.u<<" "<<r.v<<endl;
    }



    return 0;
}