Cod sursa(job #3267292)

Utilizator TimurealTimu Ionut Timureal Data 11 ianuarie 2025 10:46:03
Problema Lowest Common Ancestor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <bits/stdc++.h>
using namespace std;
int  n , m , x;
struct muchie{
    int a , b , cost;
}edge[10005];

bool comparator(muchie a  , muchie b){
    return a.cost<b.cost;
}

class UandF{
    private:
        int n;
    public:
        void init(int sz)
        {
            n=sz;
            card.resize(n+1);
            t.resize(n+1);
            for(int i=1 ; i<=n ; i++)
            {
                t[i]=i;
                card[i]=1;
            }
        }
        int gasire(int nod)
        {
            if(t[nod]==nod) return nod;
            return t[nod]=gasire(t[nod]);
        }
        void unire(int nod1 , int nod2)
        {
            nod1=gasire(nod1);
            nod2=gasire(nod2);
            if(nod1==nod2) return ;
            if(card[nod2]>card[nod1]) swap(nod1 , nod2);
            t[nod2]=nod1;
            card[nod1]+=card[nod2];
        }
}link;

int main()
{
    freopen("data.in" , "r", stdin);
    freopen("data.out" , "w" ,stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m;
    for(int i=0 ; i<m;  i++)
    {
        cin>>edge[i].a>>edge[i].b>>edge[i].cost;
    }
    sort(edge , edge+m , comparator);
    queue<pair<int , int>> sol;
    long long costmin=0;
    for(int i=0 ; i<m; i++)
    {
        if(link.gasire(edge[i].a)!=link.gasire(edge[i].b))
        {
            link.unire(edge[i].a , edge[i].b);
            costmin+=edge[i].cost;
            sol.push({edge[i].a , edge[i].b});
        }
    }
    while(!sol.empty())
    {
        cout<<sol.front().first<<" "<<sol.front().second<<"\n";
        sol.pop();
    }

    return 0;
}