Cod sursa(job #2512538)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 21 decembrie 2019 11:29:43
Problema Arbore partial de cost minim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

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

int n, m;
struct muc{
	int a, b, v;
	bool operator<(const muc &rhs){
		return v < rhs.v;
	}
};

muc muci[400041];

int tre[200041];
void nuke(){
	for(int i = 1; i <= n; ++i){
		tre[i] = i;
	}
}

vector<muc> sol;
int dad(int a){
	int r = a;
	if(a != tre[a]){
		r = dad(tre[a]);
		tre[a] = r;
	}
	return r;
}

void reu(int a, int b){
	a = dad(a);
	b = dad(b);
	tre[a] = b;
}

bool tog(int a, int b){
	a = dad(a);
	b = dad(b);
	return (a==b);
}

int sumy(){
	int s = 0;
	for(auto x : sol){
		s += x.v;
	}
	return s;
}

int main(){
	fin >> n >> m;
	for(int i = 0; i < m; ++i){
		muc &x = muci[i];
		fin >> x.a >> x.b >> x.v;
	}
	sort(muci, muci+m);
	nuke();
	
	for(int i = 0; i < m; ++i){
		muc x = muci[i];
		if(!tog(x.a, x.b)){
			reu(x.a, x.b);
			sol.push_back(x);
		}
	}
	
	fout << sumy() << "\n";
	fout << sol.size() << "\n";
	for(auto x : sol){
		fout << x.a << " " << x.b << "\n";
	}
	return 0;
}