Cod sursa(job #650869)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 19 decembrie 2011 01:36:57
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
 # include <fstream>
 # include <algorithm>

 # define dim 200002

 using namespace std;

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

 struct apm
 {
	 int n1, n2, cost;
 };

 apm a[ dim ];

 int cmp( apm a, apm b )
 {
	 return a.cost < b.cost;
 }

 int n, m;
 int c[ dim ];
 int  costmin, amin[ dim ], cnt;
 
 void citire()
 {
	 int i;
	 f >> n >> m;
	 for ( i = 1 ; i <= m ; i++ )
		 f >> a[ i ].n1 >> a[ i ].n2 >> a[ i ].cost;
		 
 }
 
 void conex()
 {
	 int i;
	 for ( i = 1 ; i <= n ; i++ )
		 c[ i ] = i;
 }
 
 void leaga( int x, int y )
 {
	 c[ x ] = y;
 }
 
 int cauta( int x )
 {
	 int r;
	 
	 r = x;
	 
	 while ( c[ r ] != r )
		 r = c[ r ];
	 
	 return r;
 }
 
 void rezolva()
 {
	 int m1, m2, i;
	 
	 sort( a + 1, a + m + 1, cmp );
	 
	 for ( i = 1 ; i <= m && cnt < n ; i++ )
	 {
		 m1 = cauta( a[ i ].n1 );
		 m2 = cauta( a[ i ].n2 );
		 
		 //g << m1 << " " << m2 << "\n";
		 
		 if ( m1 != m2 )
		 {
			 cnt ++;
			 costmin = costmin + a[ i ].cost;
			 amin[ cnt ] = i;
			 leaga( m1, m2 );
		 }			 
		 
	 }
		 
 }
 
 void afisare()
 {
	 int i;
	 g << costmin << "\n";
	 g << cnt << "\n";
	 for ( i = 1 ; i <= cnt ; i++ )
		 g << a[ amin[ i ] ].n1 << " " << a[ amin[ i ] ].n2 << " " << a[ amin[ i ] ].cost << "\n";
	 
 }
 

 int main()
 {
	 citire();
	 conex();
	 rezolva();
	 afisare();
	 return 0;
 }