Cod sursa(job #3321774)

Utilizator stefanpopaPopa Stefan Gabriel stefanpopa Data 11 noiembrie 2025 12:34:48
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

struct Edge {
    int x, y, cost;
};

bool cmp(const Edge& a, const Edge& b) {
    return a.cost < b.cost;
}

vector<int> parent, rankv;

int findRoot(int x) {
    if (parent[x] != x)
        parent[x] = findRoot(parent[x]);
    return parent[x];
}

void unite(int x, int y) {
    x = findRoot(x);
    y = findRoot(y);
    if (x == y) return;
    if (rankv[x] < rankv[y])
        parent[x] = y;
    else if (rankv[x] > rankv[y])
        parent[y] = x;
    else {
        parent[y] = x;
        rankv[x]++;
    }
}

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

    int N, M;
    fin >> N >> M;

    vector<Edge> edges(M);
    for (int i = 0; i < M; i++)
        fin >> edges[i].x >> edges[i].y >> edges[i].cost;

    sort(edges.begin(), edges.end(), cmp);

    parent.resize(N + 1);
    rankv.resize(N + 1, 0);
    for (int i = 1; i <= N; i++)
        parent[i] = i;

    long long totalCost = 0;
    vector<pair<int, int>> result;

    for (int i = 0; i < M; i++) {
        int rx = findRoot(edges[i].x);
        int ry = findRoot(edges[i].y);
        if (rx != ry) {
            unite(rx, ry);
            totalCost += edges[i].cost;
            result.push_back({ edges[i].x, edges[i].y });
        }
    }

    fout << totalCost << "\n";
    fout << result.size() << "\n";
    for (size_t i = 0; i < result.size(); i++)
        fout << result[i].second << " " << result[i].first << "\n";

    fin.close();
    fout.close();
    return 0;
}