Pagini recente » Cod sursa (job #2832438) | Cod sursa (job #2819800) | Cod sursa (job #2192532) | Cod sursa (job #2577190) | Cod sursa (job #780580)
Cod sursa(job #780580)
#include<stdio.h>
#define MAX 200001
FILE *f , *g ;
struct {
int x , y , c ;
bool d;
}a[MAX] , aux;
int n , m , cost , much , rang[MAX] , point[MAX] ;
void citire();
void sort();
void kruskal();
int find(int x);
void reun(int x , int y);
void tipar();
void swap(int i , int j);
int main()
{
citire();
sort();
kruskal();
tipar();
return 0;
}
void citire()
{
f=fopen("apm.in" , "r" );
fscanf(f , "%d%d" , &n , &m );
for( int i = 1 ; i<= m ; ++i )
fscanf(f , "%d%d%d" , &a[i].x , &a[i].y , &a[i].c );
fclose(f);
}
void sort()
{
int h , sw ;
h = m;
while(h > 1)
{
h/=2;
do
{
sw = 0;
for( int i = 1 ; i<= m-h ; ++i )
if(a[i].c > a[i+h].c)
{
swap(i,i+h);
sw = 1;
}
}while(sw);
}
}
void swap(int i , int j )
{
aux = a[i];
a[i] = a[j];
a[j] = aux;
}
void kruskal()
{
for( int i = 1 ; i<= n ; ++i )
{
rang[i] = 1;
point[i] = i;
}
int k = 1;
while(much < n-1 )
{
if(find(a[k].x) != find(a[k].y))
{
reun(find(a[k].x),a[k].y);
cost+=a[k].c;
a[k].d = 1;
much ++ ;
}
k++;
}
}
int find(int x)
{
int aux , aux1;
aux = point[x];
while(aux != point[aux])
aux = point[aux];
while(x != point[x])
{
aux1 = point[x];
point[x] = aux;
x = aux1;
}
return aux;
}
void reun( int x , int y)
{
if(rang[x] > rang[y])
point[y] = x;
else
point[x] = point[y];
if(rang[x] == rang[y])
rang[y]++;
}
void tipar()
{
g=fopen("apm.out" , "w" );
/*for( int i = 1 ; i<= m ; ++i )
fprintf(g , "%d %d %d\n" , a[i].x , a[i].y , a[i].c );*/
fprintf(g , "%d\n%d\n" , cost , much);
for( int i = 1 ; i<= m ; ++i )
if(a[i].d)
fprintf(g , "%d %d\n" , a[i].x , a[i].y );
fclose(g);
}