Cod sursa(job #2805716)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 21 noiembrie 2021 19:44:06
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");
int N, M;


int findDis(int elem, vector<pair<int, int>> &multimi)
{
    int radacina = elem;
    while(multimi[radacina].first != radacina) {
        radacina= multimi[radacina].first;
    }
    while(multimi[elem].first != radacina) {
        int auxiliar = multimi[elem].first;
        multimi[elem].first = radacina;
        elem = auxiliar;
    }
    return radacina;
}

void unionDis(const int x, const int y, vector<pair<int, int>> &multimi)
{
    int radX = findDis(x, multimi), radY = findDis(y, multimi);

    if(multimi[radX].second > multimi[radY].second) {
        multimi[radX].second = multimi[radX].second + multimi[radY].second;
        multimi[radY].first = radX;
        multimi[radY].second = multimi[radX].second;
    }
    else{
        multimi[radY].second = multimi[radY].second + multimi[radX].second;
        multimi[radX].first = radY;
        multimi[radX].second = multimi[radY].second;
    }
}


void Kruskal(vector<pair<int, pair<int, int>>> muchii)
{
    vector<pair<int, int>> multimi(N + 1, {0, 0});
    vector<int> rez(1, -1);
    int costTotal = 0;

    for(int i = 1; i <= N; ++i) {
        multimi[i] = {i, 1};
    }

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

    for(int i = 1; i <= M; ++i) {
        if( findDis(muchii[i].second.first, multimi) != findDis(muchii[i].second.second, multimi) ){
            costTotal = costTotal + muchii[i].first;
            rez.push_back(i);
        }

        if(rez.size() >= N) break;
    }

    fout << costTotal << "\n";
    for(int i = 1; i < rez.size(); ++i) {
        int j = rez[i];
        fout << muchii[j].second.first << " " << muchii[j].second.second << "\n";
    }
}
int main()
{
    fin >> N >> M;
    vector<pair<int, pair<int, int>>> muchii(M+1);
    for(int i = 1; i <= M; ++i) {
        int x, y, c;
        fin >> x >> y >> c;
        muchii[i] = {c, {x, y}};
    }
    Kruskal(muchii);
    return 0;
}