Cod sursa(job #1825993)

Utilizator tudorcomanTudor Coman tudorcoman Data 9 decembrie 2016 22:24:32
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb

#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

const int maxM = 4000001;

class Muchie {
public:
  int x, y, cost;
  inline bool operator < (const Muchie& other) const {
    return cost < other.cost;
  }
} G[maxM];

int padure[maxM];
int grupa(int i) {
  if(padure[i] == i)
    return i;
  padure[i] = grupa(padure[i]); /// compresia caii
  return padure[i];
}

int reuniune(int i, int j) {
  padure[grupa(i)] = grupa(j);
}

int v[maxM];

int main() {
  freopen("apm.in", "r", stdin);
  freopen("apm.out", "w", stdout);
  int N, M;
  scanf("%d %d", &N, &M);
  for(int i = 1; i <= M; ++ i)
    scanf("%d %d %d", &G[i].x, &G[i].y, &G[i].cost);

  sort(G + 1, G + M + 1);
  for(int i = 1; i <= N; ++ i)
    padure[i] = i;

  int ans = 0;
  vector<int> v;
  for(int i = 1; i <= M; ++ i) {
    if(grupa(G[i].x) != grupa(G[i].y)) {
      ans += G[i].cost;
      reuniune(G[i].x, G[i].y);
      v.push_back(i);
    }
  }


  printf("%d\n%d\n", ans, N - 1);
  for(int i = 0; i < N - 1; ++ i)
    printf("%d %d\n", G[v[i]].y, G[v[i]].x);
  return 0;
}