Cod sursa(job #3258915)

Utilizator Swampystefan dom Swampy Data 24 noiembrie 2024 12:25:48
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>
#include<fstream>
#include<vector>

using namespace std;

ifstream f("apm.in");
ofstream of("apm.out");


struct muchie
{
    int x,y,c;


}v[500000];


bool cmp(muchie a,  muchie b)
    {return a.c<b.c;}


int X[500000],Y[500000];


struct DSU{
    int rp[500000], sz[500000];



    DSU(int n)
    {
        for(int i=1;i<=n;i++)
        {
            rp[i]=i;
            sz[i]=1;
        }
    }

    int rep(int a)
    {
        if(a==rp[a])
        return a;
        else
        {return rp[a]=rep(rp[a]);}
    }





    bool frati(int a,int b)
    {
        if(rep(a)==rep(b))
            return 1;
        else return 0;
    }

    void unire(int a,int b)
    {
        int ra=rep(a);
        int rb=rep(b);



        if(sz[ra]<sz[rb])
        {
        rp[ra]=rp[rb];
        sz[rb]+=sz[ra];
        }
        else
        {
        rp[rb]=rp[ra];
        sz[ra]+=sz[rb];
        }


    }






};







int main()
{

    int n,m;
    int k=1,s=0;
    f>>n>>m;
    for(int i=1;i<=m;i++)
        f>>v[i].x>>v[i].y>>v[i].c;

     sort (v, v+m, cmp);

    DSU dsu(n);

    for(int i=1;i<=m;i++)
    {
        if(!dsu.frati(v[i].x,v[i].y))
        {
            dsu.unire(v[i].x,v[i].y);
            k++;
            s+=v[i].c;
            X[k]=v[i].x;
            Y[k]=v[i].y;

        }
    }

    of<<s<<' '<<k;


    for(int i=1;i<k;i++)
       of<<X[k]<<' '<<Y[k];

    return 0;
}