Cod sursa(job #2738496)

Utilizator bogdanvladmihaiBogdan Vlad-Mihai bogdanvladmihai Data 5 aprilie 2021 22:26:46
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("apm.in");
ofstream out("apm.out");

const int max_n = (int)2e5 + 5;

struct Edge {
  int u, v, c;
  Edge(int _u, int _v, int _c) {
    u = _u;
    v = _v;
    c = _c;
  }
};

int n, m;

int dad[max_n], size[max_n];

vector<Edge> edges;

bool operator < (const Edge &a, const Edge &b) {
  return a.c < b.c;
}

int get(int u) {
  if (dad[u] == u) {
    return u;
  }
  return dad[u] = get(dad[u]);
}

void join(int u, int v) {
  if (size[u] > size[v]) {
    swap(u, v);
  }
  dad[u] = v;
  size[v] += size[u];
}

int main() {
  in >> n >> m;
  for (int i = 1; i <= m; i++) {
    int u, v, c;
    in >> u >> v >> c;
    edges.push_back(Edge(u, v, c));
  }
  sort(edges.begin(), edges.end());
  for (int i = 1; i <= n; i++) {
    dad[i] = i;
    size[i] = 1;
  }
  vector<Edge> ansTree;
  int ans = 0;
  for (Edge e : edges) {
    int u = e.u, v = e.v, c = e.c;
    u = get(u);
    v = get(v);
    if (v == u) {
      continue;
    }
    ans += c;
    join(u, v);
    ansTree.push_back(e);
  }
  out << ans << "\n" << n - 1 << "\n";
  for (Edge e : ansTree) {
    out << e.u << " " << e.v << "\n";
  }
  return 0;
}