Cod sursa(job #2500037)

Utilizator traiandobrinDobrin Traian traiandobrin Data 27 noiembrie 2019 10:16:53
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define int long long
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
const int MMAX=200005;
const int NMAX=200005;
struct muchie
{ //structurile tbsa fie multipliide int
    int u,v,cost,sel;
} ;
muchie v[NMAX];
int t[NMAX],h[NMAX];
bool cmp(const muchie &a,const muchie &b)
{
    //e mai rapid cu & ca fac economie de memorie si nu mai sta sa copieze vaiabila ceva cred
    return a.cost<b.cost;
}
int findset(int  x)
{
    while(x!=t[x])
        x=t[x];
    return x;
}
void unite(int x,int y)
{
    if(h[x]==h[y])
        ++h[x],t[y]=x;
        else
            if(h[x]>h[y])
            t[y]=x;
        else
            t[x]=y;
}
main()
{
    int n,m,i,x,y,c,nr,z;
    long long tcost=0;
    cin>>n>>m;
    for(i=1;i<=n;++i)
    {
        t[i]=i;
        h[i]=1;
    }
    for(i=1;i<=m;++i)
    {   //ca uneori nu citeste bine in struct
        cin>>x>>y>>z;
        v[i].u=x;
        v[i].v=y;
        v[i].cost=z;
        v[i].sel=0;
    }
    sort(v+1,v+m+1,cmp);
    nr=0;
    for(i=1;i<=m&&nr<n-1;++i)
    {
        x=findset(v[i].u);
        y=findset(v[i].v);
        if(x!=y)
            unite(x,y),++nr,v[i].sel=1,tcost+=v[i].cost;
    }
    cout<<tcost<<'\n';
    for(i=1;i<=m;++i)
    {
        if(v[i].sel==1)
            cout<<v[i].u<<" "<<v[i].v<<'\n';
    }
    return 0;
}