Cod sursa(job #2723164)

Utilizator VladMxPMihaila Vlad VladMxP Data 13 martie 2021 18:47:10
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <bits/stdc++.h>
#define mt make_tuple

using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m,sum,t[200001],h[200001],nr;
vector<tuple<int,int,int> >muchii;

int comp(tuple<int,int,int> x, tuple<int,int,int> y)
{
    return get<0>(x)<get<0>(y);
}

int radacina(int x)
{
    int r=x,next;
    while(r!=t[r])
        r=t[r];
    while(t[x]!=r)
    {
        next=t[x];
        t[x]=r;
        x=next;
    }
    return r;
}

void uniune(int x,int y)
{
    if(h[y]>h[x])
        t[x]=y;
    else
    {
        t[y]=x;
        if(h[x]==h[y])h[x]++;
    }
}

int main()
{
    int x,y,c,i,r1,r2;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>c;
        muchii.push_back(mt(c,x,y));
    }
    for(i=1;i<=n;i++)
        t[i]=i,h[i]=1;
    sort(muchii.begin(),muchii.end(),comp);
    for(i=0;i<muchii.size();i++)
    {
        tie(c,r1,r2)=muchii[i];
        r1=radacina(r1);
        r2=radacina(r2);
        if(r1!=r2)
        {
            sum+=c;
            get<0>(muchii[i])=2000;
            nr++;
            uniune(r1,r2);
        }
    }
    fout<<sum<<'\n'<<nr<<'\n';
    for(i=0;i<muchii.size();i++)
    {
        if(get<0>(muchii[i])==2000)
            fout<<get<1>(muchii[i])<<" "<<get<2>(muchii[i])<<'\n';
    }
}