Cod sursa(job #1708437)

Utilizator IonIonescu12Ionescu Ion IonIonescu12 Data 27 mai 2016 00:56:15
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std ;

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

const int NMAX = 100001, MMAX = 200001 ;

typedef struct Muchie
{ int inc,fin,cost;
  bool ok=false;
}muchie;

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

bool comp(Muchie a , Muchie b)
{
    return a.cost < b.cost ;
}
 void citeste()
 {  Muchie x;
    f>>n>>m ;
    for(int i=0;i<m;i++) M.push_back(x);

    for (int i = 0 ; i < m ; i++)
    {
        f>>M[i].inc ;
        f>>M[i].fin ;
        f>>M[i].cost ;
        M[i].inc;
        M[i].fin;
    }
}

void initializeaza()
{
    for (int i = 0 ; 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(M.begin() , M.end() , comp) ;
    int a , b , c ;
    int cost = 0, nr = 0 ;

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

    }

    g<<cost<<"\n"<<nr<<"\n" ;
    for (int i = 0 ; i < m ; i++)
        if (M[i].ok) g<<M[i].inc<<" "<< M[i].fin<<"\n" ;
}

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