Cod sursa(job #1986068)

Utilizator GoogalAbabei Daniel Googal Data 28 mai 2017 12:38:53
Problema Arbore partial de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cassert>
#include <vector>

using namespace std;

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

struct Edge{
  int a;
  int b;
  int c;
};

const int NMAX = 200000;
const int MMAX = 400000;

int n, m, res;
int sef[1 + NMAX];
int ssz[1 + NMAX];
Edge v[1 + MMAX];
vector < Edge > output;

bool cmp(Edge x, Edge y){
  return x.c < y.c;
}

void read(){
  in >> n >> m;
  for(int i = 1; i <= m; i++)
    in >> v[i].a >> v[i].b >> v[i].c;
  in.close();
}

int getsef(int el){
  if(sef[el] == el)
    return el;
  else{
    sef[el] = getsef(sef[el]);
    return sef[el];
  }
}

void write(){
  out << res << '\n' << n - 1 << '\n';
  for(int i = 0; i < output.size(); i++)
    out << output[i].a << ' ' << output[i].b << '\n';
  out.close();
}

int main()
{
  read();
  sort(v + 1, v + m + 1, cmp);
  for(int i = 1; i <= n; i++){
    sef[i] = i;
    ssz[i] = 1;
  }

  for(int i = 1; i <= m; i++){
    int bx = getsef(v[i].a);
    int by = getsef(v[i].b);

    if(bx != by){
      assert(bx != by);
      if(ssz[by] <= ssz[bx]){
        ssz[bx] += ssz[by];
        sef[by] = bx;
      }else{
        ssz[by] += ssz[bx];
        sef[bx] = by;
      }
      res += v[i].c;
      output.push_back(v[i]);
    }
  }
  write();
  return 0;
}