Cod sursa(job #2833816)

Utilizator Teodor_AxinteAxinte Teodor-Ionut Teodor_Axinte Data 15 ianuarie 2022 19:03:33
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N=100010;

vector<pair<int,pair<int,int>>> cost;
vector<pair<int,int>> apm;

int n,m,x,y,cost_muchie,cost_total,tata[N], rang[N];


int find(int x)
{
    while(x!=tata[x])
        x=tata[x];
    return x;
}

void unite(int x, int y)
{
    x=find(x);
    y=find(y);

    if(rang[x] >= rang[y])
    {
        tata[y] = x;
        rang[x] += rang[y];
    }
    else
    {
        tata[x] = y;
        rang[y] += rang[x];
    }
}

void kruskal()
{
    sort(cost.begin(),cost.end());

    for(auto it : cost)
        if(find(it.second.first) != find(it.second.second))
        {
            apm.push_back(it.second);
            unite(it.second.first,it.second.second);
            cost_total += it.first;
        }
}


int main()
{
    fin>>n>>m;
    for(int i=0;i<m;i++)
    {
        fin>>x>>y>>cost_muchie;
        cost.push_back(make_pair(cost_muchie,make_pair(x,y)));
    }

    for(int i=0;i<n;i++)
        {
            tata[i] = i;
            rang[i] = 1;
        }

    kruskal();

    fout<<cost_total<<'\n';

    for(int i=0;i<apm.size();i++)
        fout<<apm[i].first<<" "<<apm[i].second<<'\n';
    
    return 0;
}