Cod sursa(job #2430785)

Utilizator AaronAaron Panaitescu Aaron Data 16 iunie 2019 14:01:52
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int dad[400001];
int boss(int slave)
{
    if( dad[slave] != slave )
        dad[slave] = boss(dad[slave]);
    return dad[slave];
}

int unify(int a, int b)
{
    dad[ boss(a) ] = boss(b);
}

int main()
{
    FILE *fin;
    FILE *fout;
    fin = fopen("apm.in", "r");
    fout = fopen("apm.out", "w");
    int V, E;
    fscanf(fin, "%d%d", &V, &E);
    for(int i=1; i<=V; i++)
        dad[i] = i;

    vector < pair < int, pair < int, int> > > edges;
    vector < pair < int, int> > results;
    int a, b, w;
    for(int i=0; i<E; i++)
    {
        fscanf(fin, "%d%d%d", &a, &b, &w);
        edges.push_back(make_pair(w, make_pair(a, b) ) );
    }

    sort(edges.begin(), edges.end());

    int Weight = 0, Edges = 0, i = 0;
    while( Edges < V-1 && i<E )
    {
        a = edges[i].second.first;
        b = edges[i].second.second;
        w = edges[i].first;
        if(boss(a)!=boss(b))
        {
            unify(a, b);
            Weight += w;
            Edges++;
            results.push_back( make_pair(a, b) );
        }
        i++;
    }
    fprintf(fout, "%d\n%d\n", Weight, Edges);
    for(i=0; i<Edges; i++)
        fprintf(fout, "%d %d\n", results[i].first, results[i].second);
}