Cod sursa(job #2020958)

Utilizator valentinoMoldovan Rares valentino Data 12 septembrie 2017 14:14:26
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#define NM 400004

using namespace std;

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

vector < pair < int, int > > v;
int gr[NM / 2], r[NM / 2];
int n, m, sol;
int x[NM], indx[NM], y[NM], c[NM];

int Find(int x)
{
    int y = x, aux;
    for(x; x != gr[x]; x = gr[x]);
    while(y != gr[y])
    {
        aux = gr[y];
        gr[y] = x;
        y = gr[y];
    }
    return x;
}

void Union(int i, int j)
{
    if(r[i] > r[j]) gr[j] = i;
    else gr[i] = j;
    if(r[i] == r[j]) r[j]++;
}

bool cmp(int a, int b)
{
    return c[a] < c[b];
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i) gr[i] = i, r[i] = 1;
    for(int i = 1; i <= m; ++i)
    {
         f >> x[i] >> y[i] >> c[i];
         indx[i] = i;
    }
    sort(indx + 1, indx + m + 1, cmp);
    for(int i = 1; i <= m; ++i)
    {
        if(Find(x[ indx[ i ] ]) != Find(y[ indx[ i ] ]))
        {
            sol += c[ indx[ i ] ];
            v.push_back(make_pair(x[indx[i]], y[indx[i]]));
            Union(Find( x[ indx[ i ] ]), Find( y[ indx[ i ] ]));
        }
    }
    g << sol << '\n' << n - 1 << '\n';
    for(int i = 0; i < v.size(); ++i)
        g << v[i].first << ' ' << v[i].second << '\n';

}