Cod sursa(job #3264817)

Utilizator bexxRebeca N bexx Data 24 decembrie 2024 12:50:39
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;

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

struct triple
{
    int x,y,c;
};
int n,m,cost,cnt;
vector<int>t,r;
vector<triple>v;
bitset<400002>used;

bool cmp(const triple &a, const triple &b)
{
    return a.c<b.c;
}
int root(int nod)
{
    if(t[nod]==nod)
        return nod;
    return t[nod]=root(t[nod]);
}
void citire()
{
    cin>>n>>m;
    t.resize(n+1);
    r.resize(n+1);
    v.resize(m);
    for(int i=0; i<m; i++)
        cin>>v[i].x>>v[i].y>>v[i].c;
    sort(v.begin(),v.end(),cmp);
}
void kruskal()
{
    for(int i=1; i<=n; i++)
        t[i]=i;
    for(int i=0; i<m; i++)
    {
        if(cnt==n)
            return;
        int rx=root(v[i].x),ry=root(v[i].y);
        if(rx!=ry)
        {
            cost+=v[i].c;
            used[i]=1;
            if(r[rx]<r[ry])
                t[rx]=ry;
            else
            {
                t[ry]=rx;
                if(r[ry]==r[rx])
                    r[rx]++;
            }
        }
    }
}
void afisare()
{
    cout<<cost<<'\n'<<used.count()<<'\n';
    for(int i=0; i<m; i++)
        if(used[i])
            cout<<v[i].x<<' '<<v[i].y<<'\n';
}
int main()
{
    citire();
    kruskal();
    afisare();
    return 0;
}