Cod sursa(job #1615779)

Utilizator JibrilCernea Bernard Silvestru Jibril Data 26 februarie 2016 21:00:06
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#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;
}