Cod sursa(job #2844014)

Utilizator mediocrekarmaChirvasa George Matei mediocrekarma Data 3 februarie 2022 16:10:38
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");

const int N_MAX = 200000, M_MAX = 400000;

struct Edge {
    int x = 0, y = 0, cost = 0;
    Edge() = default;
    Edge(const int& x_, const int& y_, const int& cost_) :
        x(x_), y(y_), cost(cost_) {}
    const bool operator < (const Edge& b) const {
        return cost < b.cost;
    }
}edges[M_MAX];

int root[N_MAX + 1];

int findRoot(const int& x) {
    if (x == root[x]) {
        return x;
    }
    return root[x] = findRoot(root[x]);
}

void unite(int a, int b) {
    root[a] = root[b];
}

int main() {
    //ios_base::sync_with_stdio(0);
    fin.tie(0);
    int n, m, totalCost = 0, cnt = 0;
    fin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int x, y, cost;
        fin >> x >> y >> cost;
        edges[i] = Edge(x, y, cost);
    }
    for (int i = 1; i <= n; ++i) {
        root[i] = i;
    }
    sort(edges, edges + m);
    int usedEdge[N_MAX] = {0};
    for (int i = 0; i < m; ++i) {
        int root_x = findRoot(edges[i].x);
        int root_y = findRoot(edges[i].y);
        if (root_x != root_y) {
            totalCost += edges[i].cost;
            root[root_x] = root[root_y];
            usedEdge[cnt++] = i;
        }
    }
    fout << totalCost << '\n' << cnt << '\n';
    for (int i = 0; i < cnt; ++i) {
        fout << edges[usedEdge[i]].x << ' ' << edges[usedEdge[i]].y << '\n';
    }
}