Pagini recente » Cod sursa (job #1899397) | Cod sursa (job #1938802) | Cod sursa (job #3326641) | Cod sursa (job #2247703) | Cod sursa (job #3320132)
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
std::ifstream fin("apm.in");
std::ofstream fout("apm.out");
struct Muchie {
int u, v, cost;
bool operator<(const Muchie &m) const {
return cost < m.cost;
}
bool operator>(const Muchie &m) const {
return cost > m.cost;
}
};
struct DSU {
std::vector<int> tata;
std::vector<int> h;
DSU(int n) {
tata.assign(n, 0);
h.assign(n, 0);
}
int find(int u) {
if (!tata[u])
return u;
return tata[u] = find(tata[u]);
}
void unite(int u, int v) {
int ru = find(u);
int rv = find(v);
if (ru != rv) {
if (h[ru] > h[rv]) {
tata[rv] = ru;
} else {
tata[ru] = rv;
if (h[ru] == h[rv]) {
h[rv] += 1;
}
}
}
}
};
void kruskal(int n, int m, std::vector<Muchie> &muchii) {
std::sort(muchii.begin(), muchii.end());
DSU dsu(n);
std::vector<Muchie> apcm;
int costTotal = 0;
int nrmsel = 0;
for (const auto &muchie: muchii) {
if (dsu.find(muchie.u) != dsu.find(muchie.v)) {
apcm.push_back(muchie);
costTotal += muchie.cost;
nrmsel++;
dsu.unite(muchie.u, muchie.v);
if (nrmsel == n - 1) {
break;
}
}
}
fout << costTotal << "\n";
fout << apcm.size() << "\n";
for (const auto &muchie: apcm) {
fout << muchie.u << " " << muchie.v << "\n";
}
}
int main() {
int n, m;
fin >> n >> m;
std::vector<Muchie> muchii(m);
for (int i = 0; i < m; i++) {
fin >> muchii[i].u >> muchii[i].v >> muchii[i].cost;
}
kruskal(n, m, muchii);
fin.close();
fout.close();
}