Pagini recente » Cod sursa (job #3188848) | Cod sursa (job #3266581) | Cod sursa (job #3168210) | Cod sursa (job #3188890) | Cod sursa (job #3145357)
#include <bits/stdc++.h>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
long long rad [ 250000 ];
long long get ( long long x )
{
long long aux = x;
while ( rad [ aux ] > 0 )
{
aux = rad [ aux ];
}
while ( rad [ x ] > 0 )
{
long long pux = rad [ x ] ;
rad [ x ] = aux ;
x = pux ;
}
return aux ;
}
void unite( long long a , long long b )
{
long long x = get ( a );
long long y = get ( b ) ;
if ( rad [x ] < rad [ y ] )
{
rad [ x ] += rad[ y ] ;
rad[ y ] = x ;
}
else
{
rad [ y ] += rad [ x ] ;
rad [ x ] = y;
}
}
bool find ( long long x , long long y )
{
if ( get ( x ) == get ( y ) )
return true ;
else
return false;
}
vector<tuple<long long, long long, long long> > v;
bool compare( tuple<long long ,long long , long long> x , tuple< long long , long long , long long > y )
{
return ( get<2> (x) < get<2> (y) );
}
long long n , m ;
int main()
{
in >> n >> m ;
for (int i = 1; i <= n ; i ++ )
rad [ i ] = -1 ;
for ( int j = 1 ; j <= m ; j ++ )
{
long long a, b , c;
in >> a>> b >> c;
v.push_back(make_tuple(a , b , c ) );
}
sort (v.begin() , v.end() , compare );
long long sum = 0 ;
queue<pair<long long,long long>> q;
for ( int i = 0 ; i < v.size( ) ; i ++ )
{
long long a = get<0> ( v [ i ] );
long long b = get<1> ( v[ i ] );
long long c = get<2> (v [ i ] );
if ( find ( a , b ) == false )
{
unite (a ,b ) ;
q.push({a,b});
sum += c;
}
}
out << sum << '\n';
out << q.size() << '\n';
while ( !q.empty())
{
out << q.front().first << " " << q.front().second << '\n';
q.pop();
}
return 0;
}