Cod sursa(job #1749179)

Utilizator DevilOnFieldTudor Horia Niculescu DevilOnField Data 27 august 2016 23:15:54
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

FILE *in, *out;

struct muchie
{
    int a, b, c;
};

muchie v[400000];
int conex[200001], h[200001];

bool compy(muchie a, muchie b)
{
    return a.c < b.c;
}

int cap(int gay)
{
    if(conex[gay] != gay) {
        gay = cap(conex[gay]);
    }
    return gay;
}

void unes(int a, int b)
{
    a = cap(a);
    b = cap(b);
    if(h[a] < h[b]) {
        conex[a] = b;
    } else {
        if(h[a] > h[b]) {
            conex[b] = a;
        } else {
            conex[b] = a;
            h[a]++;
        }
    }
}

int main ()
{

    int n, m, i;

    in = fopen("apm.in", "r");
    out = fopen("apm.out", "w");

    fscanf(in, "%d%d", &n, &m);
    for(i = 1; i <= n; i++) {
        conex[i] = i;
        h[i] = 1;
    }
    for(i = 0; i < m; i++) {
        fscanf(in, "%d%d%d", &v[i].a, &v[i].b, &v[i].c);
    }

    sort(v, v + m, compy);
/*
    for(i = 0; i < m; i++) {
        printf("%d %d %d\n", v[i].a, v[i].b, v[i].c);
    }
*/
    long long s, t;
    s = 0;
    t = 0;
    for(i = 0; i < m; i++) {
        if(cap(v[i].a) != cap(v[i].b)) {
            unes(v[i].a, v[i].b);
            s = s + v[i].c;
            t++;
            v[i].c = 1001;
        }
    }

    fprintf(out, "%lld\n%lld\n", s, t);
    for(i = 0; i < m; i++) {
        if(v[i].c == 1001) {
            fprintf(out, "%d %d\n", v[i].a, v[i].b);
        }
    }

    fclose(in);
    fclose(out);

    return 0;
}