Cod sursa(job #2503666)

Utilizator yo_andrei_2003Murica Andrei yo_andrei_2003 Data 3 decembrie 2019 17:30:30
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <algorithm>

using namespace std;
int tata[100002];
struct legaturi {
    int val, n1, n2;
}leg[400002], rez[200002];
bool cmp (legaturi a, legaturi b) {
    return a.val<b.val;
}
int sef(int x) {
    if (x==tata[x]) {
        return x;
    }
    return tata[x]=sef(tata[x]);
}
void uni (int a, int b) {
    int sefa=sef(a);
    int sefb=sef(b);
    tata[sefb]=sefa;
}
int main()
{
    int n, n1, n2, c, i, m, j, total=0;
    FILE *fin, *fout;
    fin=fopen("apm.in" ,"r");
    fout=fopen("apm.out" ,"w");
    fscanf(fin, "%d%d" ,&n ,&m);
    for (i=1;i<=n;i++) {
        tata[i]=i;
    }
    for (i=0;i<m;i++) {
        fscanf(fin, "%d%d%d" ,&n1 ,&n2 ,&c);
        leg[i].val=c;
        leg[i].n1=n1;
        leg[i].n2=n2;
    }
    sort(leg, leg+m, cmp);
   /* for (i=0;i<m;i++) {
            fprintf(fout, "%d %d %d\n" ,leg[i].val ,leg[i].n1 ,leg[i].n2);
    }*/
    j=0;
    for (i=0;i<n-1;i++) {
        if (sef(leg[j].n1)!=sef(leg[j].n2)) {
            uni(leg[j].n1, leg[j].n2);
            total+=leg[j].val;
            rez[i].n1=leg[j].n1;
            rez[i].n2=leg[j].n2;
        }
        else {
            i--;
        }
        j++;
    }
    fprintf(fout, "%d\n%d\n" ,total ,n-1);
    for (i=0;i<n;i++) {
            fprintf(fout, "%d %d\n" ,rez[i].n1 ,rez[i].n2);
    }
    return 0;
}