Cod sursa(job #2837499)

Utilizator Langa_bLanga Radu Langa_b Data 22 ianuarie 2022 11:10:17
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("apm.in");
ofstream cout("apm.out");
struct much {
	int x, y, c;
};
bool sortare(much a, much b) {
	return a.c < b.c;
}
vector<much> muchi;
int n, m, rg[200002], T[200002];
pair <int, int> rez[200002];
int radacina(int a) {
	if (T[a] == a) {
		return a;
	}
	else {
		return T[a] = radacina(T[a]);
	}
}
bool cmp(much a, much b) {
	return a.c < b.c;
}
int main()
{
	cin >> n >> m;
	muchi.push_back({ 0,0,0 });
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		cin >> x >> y >> z;
		muchi.push_back({ x, y, z });
	}
	sort(muchi.begin(), muchi.end(), cmp);
	int s = 0;
	for (int i = 1; i <= n; i++) {
		T[i] = i;
		rg[i] = 1;
	}
	int cnt = 0;
	for (int i = 1; i <= m; i++) {
		int int1, int2;
		int1 = radacina(muchi[i].x);
		int2 = radacina(muchi[i].y);
		if (int1 != int2) {
			if (rg[int1] > rg[int2]) {
				T[int2] = T[int1];
			}
			if (rg[int1] < rg[int2]) {
				T[int1] = T[int2];
			}
			if (rg[int1] == rg[int2]) {
				rg[int1]++;
				T[int1] = T[int2];
			}
			cnt++;
			rez[cnt] = make_pair(muchi[i].x, muchi[i].y);
			s = s + muchi[i].c;
		}
	}
	cout << s << '\n' << n - 1 << '\n';
	for (int i = 1; i <= cnt; i++) {
		cout << rez[i].first << ' ' << rez[i].second << '\n';
	}
}