Cod sursa(job #1708358)

Utilizator PaulLuchianPaul Luchian PaulLuchian Data 26 mai 2016 22:27:39
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std ;

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

const int NMAX = 200001, MMAX = 400001 ;

class Muchie
{

public:

    int a , b , cost ;
    bool ok ;

    Muchie (int A , int B , int COST)
     {
        a = A ;
        b = B ;
        cost = COST ;
        ok = false;
    };
};

int n , m ;
vector <Muchie> muchii ;
int tata[NMAX] , rang[NMAX] ;

bool comp(Muchie a , Muchie b)
{
    return a.cost < b.cost ;
}
 void citeste()
 {
    int a , b , c ;
    in>>n>>m ;
    for (int i = 1 ; i <= m ; i++)
    {
        in>>a>>b>>c ;
        muchii.push_back(Muchie(a , b , c)) ;
    }
}

void initializeaza()
{
    for (int i = 1 ; i <= n ; i++)
    {
        tata[i] = i ;
        rang[i] = 1 ;
    }
}

int radacina(int x)
{
    if (x == tata[x]) return x ;
    tata[x] = radacina (tata[x]) ;
    return tata[x] ;
}

void uneste(int a , int b)
{
    a = radacina(a) ;
    b = radacina(b) ;
    if (rang[b] > rang[a]) tata[a] = b ;
    else tata[b] = a ;
    if (rang[a] == rang[b]) rang[a]++ ;
}

bool sunt_unite (int a , int b)
{
    a = radacina(a) ;
    b = radacina(b) ;
    return a == b ;
}
void apm()
{
    initializeaza() ;
    sort(muchii.begin() , muchii.end() , comp) ;
    int a , b , c ;
    int cost = 0, nr = 0 ;

    for (int i = 0 ; i < m ; i++)
    {
        a = muchii[i].a ;
        b = muchii[i].b ;
        c = muchii[i].cost ;
        if (!sunt_unite(a, b))
        {
            uneste(a, b);
            muchii[i].ok = true;
            cost += c;
            nr++;
        }

    }

    out<<cost<<"\n"<<nr<<"\n" ;
    for (int i = 0 ; i < m ; i++)
        if (muchii[i].ok) out<<muchii[i].a<<" "<< muchii[i].b<<"\n" ;
}

int main()
{
    citeste() ;
    apm() ;
    return 0 ;
}