Cod sursa(job #2715204)

Utilizator danhHarangus Dan danh Data 3 martie 2021 11:15:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

ifstream fin("apm.in");
ofstream fout("apm.out");

const int NMAX = 200005;

int tt[NMAX], rnk[NMAX];

int n, m;


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

bool comp(edge a, edge b)
{
    return a.c < b.c;
}

vector<edge> v;

vector<pair<int, int> >rez;

int root(int x)
{
    int R, y;
    for(R = x; R != tt[R]; R = tt[R]);

    while(x != tt[x])
    {
        y = tt[x];
        tt[x] = R;
        x = y;
    }

    return R;
}

void unite(int rx, int ry)
{
    if(rnk[rx] > rnk[ry])
    {
        tt[ry] = rx;
    }
    else
    {
        tt[rx] = ry;
    }
    if(rnk[rx] == rnk[ry])
    {
        rnk[ry]++;
    }
}

int kruskal()
{
    sort(v.begin(), v.end(), comp);
    int cmin = 0, nr = 0, i = 0;
    while(nr < n - 1)
    {
        int n1 = v[i].x, n2 = v[i].y, c = v[i].c;
        int rx = root(n1), ry = root(n2);
        if(rx != ry)
        {
            unite(rx, ry);
            rez.push_back({n1, n2});
            cmin += c;
            nr++;
        }
        i++;

    }

    return cmin;
}

int main()
{
    int x, y, c, i, j;

    fin>>n>>m;

    for(i = 1; i <= m; i++)
    {
        fin>>x>>y>>c;
        v.push_back({x, y, c});
    }

    for(i = 1; i <= n; i++)
    {
        tt[i] = i;
        rnk[i] = 1;
    }

    fout<<kruskal()<<'\n';
    fout<<rez.size()<<'\n';

    for(i=0; i<rez.size(); i++)
    {
        fout<<rez[i].first<<' '<<rez[i].second<<'\n';
    }

    fin.close();
    fout.close();
    return 0;
}