Cod sursa(job #2966020)

Utilizator alexandrubilaBila Alexandru-Mihai alexandrubila Data 16 ianuarie 2023 17:49:57
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <algorithm>
///#include <vector>
using namespace std;

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

const int MMAX = 400100;
const int NMAX = 200100;
struct muchie
{
    int x, y;
    int cost;
};

///vector <muchie> L;
muchie L[MMAX];
int n, m;
int T[NMAX];
bool viz[NMAX];
int s;

bool cmp(const muchie &a, const muchie &b)
{
    return a.cost < b.cost;
}

int Find(int i)
{
    if(T[i] == i)
        return i;
    return T[i] = Find(T[i]);
}

inline void Union(int cx, int cy)
{
    T[cy] = cx;
}

int k1, k2;
int sol1[NMAX], sol2[NMAX];

int main()
{
    f >> n >> m;
    int x, y, c;
    for(int i = 1 ; i <= m ; i++)
    {
        f >> L[i].x >> L[i].y >> L[i].cost;
    }
    sort(L + 1, L + m + 1, cmp);
    for(int i = 1 ; i <= n ; i++)
        T[i] = i;
    for(int i = 1 ; i <= m ; i++)
    {
        int rx = Find(L[i].x);
        int ry = Find(L[i].y);
        if(rx != ry)
        {
            Union(rx, ry);
            s += L[i].cost;
            sol1[++k1] = L[i].x;
            sol2[++k2] = L[i].y;
        }
    }
    g << s << '\n';
    g << n - 1 << '\n';
    for (int i = 1 ; i <= n - 1 ; i++)
        g << sol2[i] << ' ' << sol1[i] << '\n';
    return 0;
}