Cod sursa(job #3253922)

Utilizator ArcherraikoNedelcu Stefan Daniel Archerraiko Data 5 noiembrie 2024 12:39:16
Problema Arbore partial de cost minim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct muchie {
	int c, x,y;
};
vector <muchie> l;
vector <muchie> rez;
int n, m, x, y, cost, t[200001], h[200001];
void init(int v) {
	t[v] = h[v] = 0;
}
int reprez(int v) {
	if (t[v] == 0) return v;
	t[v] = reprez(t[v]);
	return t[v];
}
void reun(int u, int v) {
	int ru, rv;
	ru = reprez(u);
	rv = reprez(v);
	if (h[ru] > h[rv]) {
		t[rv] = ru;
	}
	else {
		t[ru] = rv;
		if (h[ru] == h[rv]) h[rv]++;
	}
}
bool sf(muchie m1, muchie m2) {
	return m1.c < m2.c;
}
void citire() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> x >> y >> cost;
		muchie m;
		m.c = cost;
		m.y = y;
		m.x = x;
		l.push_back(m);
	}
}
int main() {
	int s = 0;
	citire();
	sort(l.begin(), l.begin() + m, sf);
	for (int i = 0; i < m; i++) init(i);
	for (int i = 0; i < m; i++) {
		if (reprez(l[i].x) == reprez(l[i].y)) continue;
		else {
			s += l[i].c;
			rez.push_back(l[i]);
			reun(l[i].x, l[i].y);
		}
	}
	cout << s << '\n';
	cout << rez.size() << '\n';
	for (int i = 0; i < rez.size(); i++) {
		cout << rez[i].x << ' ' << rez[i].y << '\n';
	}
	return 0;
}