Pagini recente » Cod sursa (job #1326081) | Cod sursa (job #2871954) | Cod sursa (job #1482134) | Cod sursa (job #1478809) | Cod sursa (job #1705329)
#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 ];
}
}