Pagini recente » Borderou de evaluare (job #2116767) | Cod sursa (job #3284421) | Cod sursa (job #76846) | porc_revelion | Cod sursa (job #3156344)
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
const int MAXIM = 400005;
struct muchie {
int x, y, cost;
};
vector<pair<int, int>> muchii_arbore;
muchie muchii[MAXIM];
int n, m, cost_total = 0, parinte[MAXIM], rang[MAXIM];
bool comparare(muchie &a, muchie &b) {
return a.cost < b.cost;
}
inline void citire() {
fin >> n >> m;
for (int i = 0; i < m; i++) {
fin >> muchii[i].x >> muchii[i].y >> muchii[i].cost;
}
}
int root(int nod) {
while (parinte[nod] != nod) {
nod = parinte[nod];
}
return nod;
}
inline void uneste(int nod1, int nod2) {
if (rang[nod1] < rang[nod2]) {
parinte[nod1] = nod2;
} else if (rang[nod1] > rang[nod2]) {
parinte[nod2] = nod1;
} else {
parinte[nod1] = nod2;
rang[nod2]++;
}
}
inline void kruskal() {
muchii_arbore.resize(n);
sort(muchii, muchii + m, comparare);
for (int i = 0; i < m; i++) {
parinte[i] = i;
}
for (int i = 0; i < m; i++) {
int root1 = root(muchii[i].x);
int root2 = root(muchii[i].y);
if (root1 == root2) {
continue;
}
uneste(root1, root2);
muchii_arbore.push_back(make_pair(muchii[i].x, muchii[i].y));
cost_total += muchii[i].cost;
}
}
inline void afiseaza() {
// cost total
fout << cost_total << '\n';
// muchii in arbore total
fout << n - 1 << '\n';
// muchiile din arbore
for (int i = 0; i < muchii_arbore.size(); i++) {
fout << muchii_arbore[i].first << ' ' << muchii_arbore[i].second << '\n';
}
}
int main() {
citire();
kruskal();
afiseaza();
return 0;
}