Pagini recente » Cod sursa (job #515159) | Cod sursa (job #864971) | Cod sursa (job #1904350) | Cod sursa (job #903675) | Cod sursa (job #894559)
Cod sursa(job #894559)
#include<fstream>
#include<algorithm>
#include<utility>
#define NN 400009
#define f first
#define s second
#define mp make_pair
using namespace std;
ofstream out("apm.out");
int n , m , T[NN] , poz[NN] , sol , sum ;
pair < pair < int , int > , int > v[NN];
bool cmp( pair < pair < int , int > , int > i , pair < pair < int , int > , int > j )
{
return i.s < j.s ;
}
void read();
void prep();
int find( int x );
void uneste( int x , int y );
void Kruskal();
void wrs();
int main()
{
read();
Kruskal();
wrs();
return 0;
}
void read()
{
ifstream in("apm.in");
in >> n >> m;
for( int x , y , cost , i=1 ; i<=m ; i++)
{
in >> x >> y >> cost;
v[i] = mp ( mp ( x , y ) , cost ) ;
}
prep();
}
void prep()
{
for( int i=1 ; i<=n ; i++)
T[i] = i;
}
int find( int x )
{
if ( x != T[x] )
return T[x] = find( T[x] );
return x;
}
void uneste( int x , int y)
{
int m1 , m2;
m1 = find( x );
m2 = find( y );
T[ m2 ] = m1;
}
void Kruskal()
{
sort( v + 1 , v + m + 1 , cmp );
pair < pair < int , int > , int > I;
for( int i=1 ; i<=m ; i++ )
{
I = v[i];
int x , y , cost;
x = (I.f).f;
y = (I.f).s;
cost = I.s;
if ( find(x) != find(y) )
{
poz[ ++sol ] = i;
sum+=cost;
uneste(x,y);
}
}
}
void wrs()
{
out << sum << '\n';
out << sol << '\n';
for( int i=1 ; i<=sol;i++)
out << (v[ poz[i] ].f).f << " " << (v[ poz[i] ].f).s << " " << v[ poz[i] ].s << '\n';
}