Cod sursa(job #1705329)

Utilizator TorridasSandu Ionut-Catalin Torridas Data 20 mai 2016 12:19:41
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

typedef struct m
{
    int x;
    int y;
    int cost;
} muchie;

typedef struct n
{
    int nod;
    n* tata;
} arb;

bool comparator ( const muchie& m1 , const muchie& m2 )
{
    return m1.cost  < m2.cost;
}


int nr_n;
int nr_m;
const int maxn = 200001;
const int maxm = 400001;

muchie muchii[ maxm ];
int r_noduri [ maxm ];
arb multimi [ maxn ];
int adancime [ maxn ];

int gaseste_radacina( int nod );
void uneste( int rad1 , int rad2 );

int main()
{
    //cout << "Hello world!" << endl;
    f >> nr_n >> nr_m;
    int pozitii[ nr_m  ] , k = 0, tc = 0;

    for ( int  i = 1 ; i <=nr_m ; i++ )
    {
         f >> muchii[ i ].x >> muchii[ i ].y >> muchii[ i ].cost;
    }

    sort(muchii + 1, muchii + nr_m + 1 , comparator );

   /* for( int  i = 1 ; i <= nr_m ; i++ )
    {
        cout<< muchii[i].cost <<"\n";
    } */

    for ( int i = 1 ; i <= nr_n ; i++ )
    {
        multimi[i].tata = &multimi[i];
        multimi[i].nod = i;
    }

    int rad1, rad2;

    for( int i = 1 ; i <= nr_m ; i++ )
    {
        rad1 = gaseste_radacina( muchii[i].x);
        rad2 = gaseste_radacina( muchii[i].y);

        if( rad1 != rad2 )
        {
            uneste( rad1 , rad2 );
            pozitii[k] = i;
            k++;
            tc += muchii[i].cost;
        }
    }

    g << tc  << " \n" << k << "\n";

    for ( int i = 0 ; i < k ; i++ )
    {
        g<<muchii[ pozitii[i] ].x << " " << muchii[pozitii[i]].y << "\n";
    }
    f.close();
    g.close();

    return 0;
}


int gaseste_radacina( int nod )
{
    if( multimi[ nod ].tata ==  &multimi[ nod ] )
        return multimi[ nod ].nod;
    else

        return gaseste_radacina( multimi[nod].tata->nod);
}

void uneste( int rad1 , int rad2 )
{
    if( adancime[ rad1 ] == adancime [ rad2 ] )
    {
        multimi[ rad1 ].tata = &multimi[ rad2 ];
        adancime[ rad2 ]++;
    }

    else if ( adancime[ rad1 ] > adancime[ rad2 ] )
    {
         multimi[ rad2 ].tata = &multimi[rad1];
    }

    else
    {
        multimi[ rad1 ].tata =&multimi[ rad2 ];
    }
}