Nu exista pagina, dar poti sa o creezi ...

Cod sursa(job #2738564)

Utilizator niculaandreiNicula Andrei Bogdan niculaandrei Data 6 aprilie 2021 01:12:54
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N_MAX = 2e5 + 5;

int N, M, x, y, c;

vector < tuple < int, int, int > > Edges;

int comp[N_MAX];

int Find(int x)
{
    if (comp[x] == x){
        return x;
    }
    comp[x] = Find(comp[x]);
    return comp[x];
}

void Union(int x, int y)
{
    comp[Find(x)] = Find(y);
}

int main()
{
    fin >> N >> M;
    for (int i = 1; i <= M; i++) {
        fin >> x >> y >> c;
        Edges.push_back(make_tuple(c, x, y));
    }
    sort(Edges.begin(), Edges.end());
    for (int i = 1; i <= N; i++) {
        comp[i] = i;
    }
    vector < pair < int, int > > Ans;
    long long sum = 0;
    for (int i = 0; i < Edges.size(); i++) {
        tuple < int, int, int > t = Edges[i];
        x = get<1>(t);
        y = get<2>(t);
        c = get<0>(t);
        if (Find(x) != Find(y)) {
            Ans.push_back(make_pair(x, y));
            Union(x, y);
            sum += c;
        }
    }
    fout << sum << "\n";
    fout << Ans.size() << "\n";
    for (int i = 0; i < Ans.size(); i++) {
        fout << Ans[i].first << " " << Ans[i].second << "\n";
    }
    return 0;
}