Cod sursa(job #2354665)

Utilizator oDexterRominu Alexandru oDexter Data 25 februarie 2019 14:45:29
Problema Arbore partial de cost minim Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <typeinfo>

using namespace std;

int parinte[400005];
ifstream f("apm.in");
ofstream g("apm.out");
vector < pair < int , pair < int , int > > > Edges;
vector < pair < int , int > > rez;

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

void Unite(int x, int y)
{
    int fx = Find(x);
    int fy = Find(y);
    parinte[fx] = fy;
}

int main()
{
    int N, M , x, y, w;

    f >> N >> M;
    for ( int i = 1 ; i <= N ; ++i)
        parinte[i] = i;

    for ( int i = 1 ; i <= M ; ++i)
    {
        f >> x >> y >> w;
        w += 1001;
        Edges.push_back( make_pair( w, make_pair(x,y)) );
    }
    sort ( Edges.begin(),Edges.end() );
    int weight = 0 , edges = 0, nr = 0;
    //int i = 0;
    while (weight < N-1 || nr < M)
    {
        int a = Edges[nr].second.first;
        int b = Edges[nr].second.second;
        int w = Edges[nr].first;

       // cout << nr << " " << weight;
        //cin.get();

        if ( Find(a) != Find(b) )
        {
            Unite(a,b);
            weight += w;
            edges ++;

            //cout << b << " " << a << " " << w << endl;
            rez.push_back(make_pair(b,a));
        }

        nr++;
    }
    g << weight - (edges*1001) << endl << edges << endl;
    for ( unsigned int i = 0 ; i < rez.size() ; ++i)
        g << rez[i].first << " " << rez[i].second << endl;

    return 0;
}