Cod sursa(job #3368469)

Utilizator stefan1010Stefan Bogdan stefan1010 Data 14 octombrie 2026 19:01:13
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <algorithm>
const int NMAX = 2e5;
const int MMAX = 4e5;
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");

struct muchie
{
    int a,b;
    int cost;
    bool ales;
}v[MMAX+1];

int n,m;
int tata[NMAX+1];

bool cmp(muchie x, muchie y)
{
    return x.cost < y.cost ? 1:0;
}

int sefsuprem(int nod)
{
    if(tata[nod] == nod)
        return nod;
    return tata[nod] = sefsuprem(tata[nod]);
}

void unite(int a, int b)
{
    int sefa = sefsuprem(a);
    int sefb = sefsuprem(b);
    tata[sefa] = sefb;
    return;
}

bool isroad(int a, int b)
{
    return sefsuprem(a) == sefsuprem(b);
}

int main()
{
    in >> n >> m;
    for(int i = 1; i <= m; i++)
    {    
        in >> v[i].a >> v[i].b >> v[i].cost;
        tata[v[i].a]=v[i].a;
        tata[v[i].b]=v[i].b;
    }
    sort(v+1, v+m+1, cmp);
    int cnt = 0;
    int sum = 0;
    for(int i = 1; i <= m && cnt < n-1; i++)
    {
        if(!isroad(v[i].a,v[i].b))
        {
            cnt++;
            sum+=v[i].cost;
            v[i].ales = 1;
            unite(v[i].a, v[i].b);
        }
    }
    out << sum << "\n";
    out << cnt << "\n";
    for(int i = 1; i <= m; i++)
        if(v[i].ales)
            out << v[i].a << " " << v[i].b << "\n";
    return 0;
}