Cod sursa(job #1694218)

Utilizator mlc_testMLC MLC mlc_test Data 24 aprilie 2016 22:23:49
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define VMAX 200009
#define EMAX 400009
using namespace std;
struct edge {
    int x, y, c;

    edge(int _x, int _y, int _c) : x(_x), y(_y), c(_c) {
    }

    bool operator<(const edge& other) const{
        return c < other.c;
    }
};




int V, E, T[VMAX],cost;
vector<edge> v;
vector<int> sol;

int gr(const int& x) {
  if(T[x] != x) {
    T[x] = gr(T[x]);
  }
  return T[x];
}

void reunion(const int& x, const int& y) {
  T[gr(x)] = gr(y);
}


int main() {
    freopen("apm.in", "r", stdin);
    freopen("apm.out", "w", stdout);
    scanf("%d%d", &V, &E);

    for (int i = 0; i < E; ++i) {
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        v.push_back(edge(x, y, c));
    }

    sort(v.begin(), v.end());
    for (int i = 1; i <= V; ++i) {
        T[i] = i;
    }
    int i = 0;
    for (auto e = v.begin(); e != v.end(); ++e, ++i) {
        if (gr(e->x) != gr(e->y)) {
            cost += e->c;
            sol.push_back(i);
            reunion(e->x, e->y);
        }
    }

    printf("%d\n%d\n", cost, sol.size());
    for (auto e = sol.begin(); e != sol.end(); ++e) {
        printf("%d %d\n", v[*e].x, v[*e].y);
    }


    return 0;

}