Cod sursa(job #2176968)

Utilizator VarticeanNicolae Varticean Varticean Data 18 martie 2018 11:57:11
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct rec
{
    int x,y,c;
}a[400005];
int n,m;
int parent[200005],sz[200005];
pair < int, int > sol[200005];

int  Find( int x )
{
    if( parent[x] == x ) return x;
    return Find(parent[x]);
}

void Union( int x, int y )
{
    x = Find(x);
    y = Find(y);
    if( sz[x] > sz[y] )
    {
        parent[y] = x;
        sz[x]+=sz[y];
    }
    else
    {
        parent[x] = y;
        sz[y] += sz[x];
    }
}

bool cmp( const rec &l, const rec &r)
{
    return l.c < r.c;
}

int main()
{
    ios::sync_with_stdio(0);
    in >> n >> m;
    for(int i=1; i<=n; i++) parent[i] = i, sz[i] = 1;
    for(int i=1; i<=m; i++)
        in >> a[i].x >> a[i].y >> a[i].c;
    sort(a+1,a+m+1,cmp);

    int k=1, sum=0, i=0;
    while( k<=m && i < n )
    {
        if( Find(a[k].x) != Find(a[k].y) )
        {
            sum += a[k].c;
            sol[++i].first = a[k].x;
            sol[i].second = a[k].y;
            Union(a[k].x, a[k].y);
            k++;
        }
        else k++;
    }
    out << sum << '\n' << n-1 << '\n'
    ;
for(int i=1; i<n; i++)
{
    out << sol[i].second << ' ' << sol[i].first << '\n';
}


    return 0;
}