Cod sursa(job #2568443)

Utilizator sipdavSipos David Oliver sipdav Data 3 martie 2020 22:54:10
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

const int dim = 200001;
const int dim1 = 400001;

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

struct a
{
    int x, y, c;
}muchii[dim1];

struct nod
{
    int r;
    nod* p;
};

int n, m, v[dim1], k;
nod* mu[dim];

bool cmp(a x, a y)
{
    return x.c < y.c;
}

nod* multime(nod* x)
{
    if(x != x->p)
        x->p = multime(x->p);
    return x->p;
}

void unite(nod* x, nod* y)
{
    nod* a = multime(x);
    nod* b = multime(y);
    if(a->r < b->r)
        a->p = b;
    else if(b->r < a->r)
        b->p = a;
    else
    {
        a->p = b;
        (b->r)++;
    }
}

void read()
{
    in>>n>>m;
    int x, y, c;
    for(int i = 1; i <= m; i++)
    {
        in>>x>>y>>c;
        muchii[i].x = x;
        muchii[i].y = y;
        muchii[i].c = c;
    }
    for(int i = 1;i <= n;i++)
    {
        mu[i] = new nod;
        mu[i]->p = mu[i];
        mu[i]->r = 0;
    }
    sort(muchii + 1, muchii + m + 1, cmp);
}

void solve()
{
    k = 0;
    int s = 0;
    for(int i = 1;i <= m;i++)
    {
        if(multime(mu[muchii[i].x]) != multime(mu[muchii[i].y]))
        {
            unite(mu[muchii[i].x], mu[muchii[i].y]);
            s += muchii[i].c;
            v[++k] = i;
        }
    }
    out<<k<<'\n';
    for(int i = 1;i <= k;i++)
    {
        out<<muchii[v[i]].x<<' '<<muchii[v[i]].y<<'\n';
    }
}

int main()
{
    read();
    solve();
    return 0;
}