Pagini recente » Cod sursa (job #2164545) | Cod sursa (job #788481) | Cod sursa (job #2721785) | Rating Iuonac Radu-Cosmin (YO128813) | Cod sursa (job #1615779)
#include <cstdio>
#include <algorithm>
using namespace std;
struct varf{
int x,y, cost;
} v[400001];
int temp=1,s, n, m, i, t[200001], h[200001], sol[200001], a, b;
int cmp(varf a, varf b){
if(a.cost<b.cost) return 1;
return 0;
}
int find(int x){
int aux=x;
if(t[x]!=x)
aux=find(t[x]);
t[x]=aux;
return aux;
}
void Union(int x, int y){
int a1=find(x), b1=find(y);
if(h[a1]>h[b1]) t[b1]=a1;
else{
t[a1]=b1;
if(h[a1]==h[b1]) h[b1]++;
}
}
int main() {
freopen("apm.in", "r", stdin);
freopen("apm.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i=0; i<m; i++)
scanf("%d%d%d", &v[i].x, &v[i].y, &v[i].cost);
for(i=1; i<=n; i++) t[i]=i;
//printf("%d %d",n, m);
sort(v, v+m, cmp);
//for(i=0; i<m; i++)
// printf("%d %d %d\n", v[i].x, v[i].y, v[i].cost);
for(i=0; i<m && temp<n; i++) {
a=find(v[i].x);
b=find(v[i].y);
if(a!=b){
Union(a,b);
s+=v[i].cost;
sol[temp]=i;
temp++;
}
}
printf("%d\n%d\n", s, temp-1);
for(i=1; i<temp; i++) printf("%d %d\n", v[sol[i]].y, v[sol[i]].x);
return 0;
}