Cod sursa(job #1958948)

Utilizator mihai.alphamihai craciun mihai.alpha Data 8 aprilie 2017 21:53:01
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

/** KRUSKAL **/

FILE *fin = fopen("apm.in", "r"), *fout = fopen("apm.out", "w");

#define MAX_M 400000
int tata[MAX_M + 1];

inline int find1(int nr)  {
    int nr1 = nr;
    while(nr1 != tata[nr1])
        nr1 = tata[nr1];
    while(nr != tata[nr])  {
        tata[nr] = nr1, nr = tata[nr];
    }
    return nr;
}

inline int union1(int i, int j)  {
    int i1 = find1(i), j1 = find1(j);
    tata[i1] = j1;
}

struct elem  {
    int x, y, c;
};

elem v[MAX_M + 1];
vector <int> vans;
int costarb;

bool cmp(elem i, elem j)  {
    return i.c < j.c;
}

int main()  {
    int n, m;
    fscanf(fin, "%d%d", &n, &m);
    for(int i = 1;i <= m;i++)  {
        int X, Y, C;
        fscanf(fin, "%d%d%d", &X, &Y, &C);
        v[i].x = X;
        v[i].y = Y;
        v[i].c = C;
    }
    for(int i = 1;i <= m;i++)
        tata[i] = i;
    sort(v + 1, v + m + 1, cmp);
    for(int i = 1;i <= m;i++)  {
        int x1 = find1(v[i].x), y1 = find1(v[i].y);
        if(x1 != y1)  {
            costarb += v[i].c, union1(v[i].x, v[i].y);
            vans.push_back(i);
        }
    }
    fprintf(fout, "%d %d\n", costarb, n - 1);
    for(unsigned int i = 0;i < vans.size();i++)
        fprintf(fout, "%d %d\n",v[vans[i]].x, v[vans[i]].y);
    fclose(fin), fclose(fout);
    return 0;
}