Cod sursa(job #1751514)

Utilizator AhileGigel Frone Ahile Data 1 septembrie 2016 15:13:52
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include<stdio.h>
#include<string.h>
using namespace std;
#define FIN "apm.in"
#define FOUT "apm.out"


int n;
int m;
int father[100010];
int rang[100010];
int s;
int counter;

struct edge  {

    int x;
    int y;
    int cost;

};

vector <edge> edges;
vector <edge> rez;

int fin(int x) {

    if(father[x] == 0) {
        return x;
    } else {
        return fin(father[x]);
    }

}

int uni (int x, int y) {

    int rooty;
    int rootx;
    rooty = fin(y);
    rootx = fin(x);
    if(rootx == rooty) {
        return 0;
    }
    if(rang[rootx] > rang[rooty]) {
        father[rooty] = rootx;
    } else {
        if(rang[rootx] < rang[rooty]) {
            father[rootx] = rooty;
        } else {
            father[rootx] = rooty;
            rang[rooty]++;
        }
    }

}

int kruskal () {

    for(int i = 0; i < edges.size(); i++) {
        if(fin(edges[i].x) != fin(edges[i].y)) {
            uni(edges[i].x, edges[i].y);
            edge e;
            e.x = edges[i].x;
            e.y = edges[i].y;
            rez.push_back(e);
            s = s + edges[i].cost;
            counter++;
            if(counter > n - 2) {
                break;
            }
        }
    }
    printf("&s \n");
    printf("&n-1 \n");
    for(int i = 0; i < rez.size(); i++) {
        printf("&rez[i] rez[i].x \n");
    }

}

int main() {

    freopen(FIN, "r",stdin);
    freopen(FOUT,"w",stdout);
    scanf("%d %d", &n,&m);

    for(int i = 0; i < m; i++) {
        edge e;
        scanf("%d %d %d", &e.x,&e.y,&e.cost);
        edges.push_back(e);
    }
     sort(edges.begin(), edges.end(), [](edge a, edge b) {
        return a.cost < b.cost;
    });

    kruskal();
}