Cod sursa(job #2175674)

Utilizator clokerulLazureanu George clokerul Data 16 martie 2018 18:23:44
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct nod{
int x,y,cost;}v[200001];
bool cmp(nod a,nod b){
return a.cost<b.cost;}
bool root(int, int);
int radacina(int );
void uniune(int,int);
int n,ind,t[200001],h[200001];
int main()
{
    int m,i,ind=0;
    long long suma=0;
    in >> n >> m;
    for(i=1;i<=m;++i)
        in >> v[i].x >> v[i].y >> v[i].cost;
    sort (v+1,v+m+1,cmp);
    for (i=1;i<=m;++i)
    {
        if (!root(v[i].x,v[i].y))
        {suma+=v[i].cost;
        uniune(v[i].x,v[i].y);
        v[++ind].x=v[i].x;
        v[ind].y=v[i].y;
        }
    }
    out << suma << '\n' << ind << '\n';
    for (i=1;i<=ind;++i)
        out << v[i].x << ' ' << v[i].y << '\n';
    return 0;
}
int radacina(int x)
{
    if (t[x]==0 || t[x]==x)
        return x;
    t[x]=radacina(t[x]);
    return t[x];
}
void uniune(int x,int y)
{
    int rx=radacina(x),ry=radacina(y);
    if (h[rx]>h[ry])
    {
        t[ry]=rx;
    }
    else
    {
        t[rx]=ry;
        if (h[rx]==h[ry])
            h[ry]++;
    }
}
bool root(int x, int y)
{
    return radacina(x)==radacina(y);
}