Cod sursa(job #2868235)

Utilizator Horis21Horia Radu Horis21 Data 10 martie 2022 20:04:36
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define N 200001
#define M 400000
#define INF 1e6

using namespace std;

struct edge
{
    int x,y,c;
};

int n,m,ans;
int nr[N];
edge e[M];
bool vis[M];
int p[N];

int root(int x)
{
    if(p[x]==x)
    {
        return x;
    }
    p[x]=root(p[x]);
    return p[x];
}


bool verif(int x, int y)
{
    return root(x)!=root(y);
}

void unionk(int x, int y)
{
    int rx=root(x);
    int
    ry=root(y);
    if(nr[rx]<nr[ry])
    {
        p[rx]=ry;
        nr[ry]+=nr[rx];
    }
    else
    {
        p[ry]=rx;
        nr[rx]+=nr[ry];
    }

}

void kruskall()
{
    for(int i=0;i<m;i++)
    {
        if(verif(e[i].x,e[i].y))
        {
            ans+=e[i].c;
            vis[i]=1;
            unionk(e[i].x,e[i].y);

        }
    }
}


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

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

int main()
{
    in >> n >> m;
    for(int i=1;i<=n;i++)
    {
        nr[i]=1;
        p[i]=i;
    }
    for(int i=0;i<m;i++)
    {
        in >> e[i].x >> e[i].y >> e[i].c;
    }
    sort(e,e+m,cmp);
    kruskall();
    out << ans << "\n";
    for(int i=0;i<m;i++)
    {
        if(vis[i])
        {
            out << e[i].x << " " << e[i].y << "\n";
        }
    }
    return 0;
}