Cod sursa(job #2348580)

Utilizator DovlecelBostan Andrei Dovlecel Data 19 februarie 2019 20:24:34
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
const int M=400005;
const int N=200005;
int nr[N],t[N],n,m;
vector< pair<int,int> >sol;

struct muchie
{
    int x,y,cost;
}v[M];

bool ok(muchie x,muchie y)
{
    return(x.cost<y.cost);
}

int radacina(int x)
{
    if(t[x]==0)
        return x;
    t[x]=radacina(t[x]);
    return t[x];
}

void reuniune(int x,int y)
{
    int rx=radacina(x);
    int ry=radacina(y);
    if(nr[rx]<nr[ry])
    {
        t[rx]=ry;
        nr[ry]+=nr[rx];
    }
    else
    {
        t[ry]=rx;
        nr[rx]+=nr[ry];
    }
}

bool aceeasi(int x,int y)
{
    return(radacina(x)==radacina(y));
}

int main()
{
    int c=0;
    in>>n>>m;
    for(int i=1;i<=m;i++)
        in>>v[i].x>>v[i].y>>v[i].cost;
    sort(v+1,v+m+1,ok);
    for(int i=1;i<=m;i++)
    {
        if(!aceeasi(v[i].x,v[i].y))
        {
            reuniune(v[i].x,v[i].y);
            c=c+v[i].cost;
            sol.push_back(make_pair(v[i].x,v[i].y));
        }
    }
    out<<c<<'\n'<<n-1<<'\n';
    for(int i=0;i<n-1;i++)
        out<<sol[i].first<<' '<<sol[i].second<<'\n';
    return 0;
}