Pagini recente » Cod sursa (job #1996390) | Cod sursa (job #198048) | Cod sursa (job #819080) | Istoria paginii runda/jff/clasament | Cod sursa (job #2080561)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("apm.in");
ofstream g ("apm.out");
const int NMAX = 200000 + 1;
const int MMAX = 400000 + 1;
int n, m;
int t[NMAX + 1];
int h[NMAX + 1];
bool in_apm[MMAX];
pair < int, pair <int, int> > muchii[MMAX];
void citeste() {
f >> n >> m;
for (int i = 1; i <= m; i++) {
f >> muchii[i].second.first >> muchii[i].second.second >> muchii[i].first;
}
}
void init() {
for (int i = 1; i <= n; i++) {
t[i] = 0;
h[i] = 1;
}
}
int get_radacina(int a) {
if (t[a] == 0) return a;
t[a] = get_radacina(t[a]);
return t[a];
}
bool query(int a, int b) {
return get_radacina(a) == get_radacina(b);
}
void unite(int a, int b) {
int ra = get_radacina(a);
int rb = get_radacina(b);
if (ra == rb) return;
if (h[ra] >= h[rb]) {
t[rb] = ra;
h[ra] = max(h[ra], h[rb] + 1);
}
else {
t[ra] = rb;
h[rb] = max(h[rb], h[ra] + 1);
}
}
void rezolva() {
sort(muchii + 1, muchii + m + 1);
int cost_total = 0;
int muchii_apm = 0;
for (int i = 1; i <= m; i++) {
int a = muchii[i].second.first;
int b = muchii[i].second.second;
if (query(a, b)) continue;
unite(a, b);
cost_total += muchii[i].first;
muchii_apm++;
in_apm[i] = true;
}
g << cost_total << '\n';
g << muchii_apm << '\n';
for (int i = 1; i <= m; i++) {
if (!in_apm[i]) continue;
g << muchii[i].second.first << ' ' << muchii[i].second.second << '\n';
}
}
int main() {
citeste();
init();
rezolva();
return 0;
}