Cod sursa(job #3240850)

Utilizator CimpoesuFabianCimpoesu Fabian George CimpoesuFabian Data 21 august 2024 18:16:50
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");

int x, y, c, r[200005], t[200005], n, m;
pair <int, int> a[400005];

struct muchie
{
    int x, y, c;
};

int Find(int x)
{
    int y;
    if (t[x] == 0)
        return x;
    y = Find(t[x]);
    t[x] = y;
    return y;
}

int Comp (muchie A, muchie B)
{
    if (A.c < B.c)
        return 1;
    return 0;
}

void Union(int x, int y)
{
    if (r[x] > r[y])
    {
        t[y] = x;
        r[x] += r[y];
    }
    else
    {
        t[x] = y;
        r[y] += r[x];
    }
}

muchie v[400005];

int main()
{
    int i, x1, y1, cm = 0, nr = 0;
    fin >> n >> m;
    for (i = 1 ; i <= m ; i++)
    {
        fin >> v[i].x >> v[i].y >> v[i].c;
    }
    sort (v + 1, v + m + 1, Comp);
    for (i = 1 ; i <= m ; i++)
    {
        x1 = v[i].x;
        y1 = v[i].y;
        x1 = Find(x1);
        y1 = Find(y1);
        if (x1 != y1)
        {
            a[++nr] = {v[i].x, v[i].y};
            cm += v[i].c;
            Union(x1, y1);
        }
    }
    fout << cm << "\n";
    fout << nr << "\n";
    for (i = 1 ; i <= nr ; i++)
        fout << a[i].first << " " << a[i].second << "\n";
}