Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <vector>
- using namespace std;
- struct Cable {
- int u;
- int v;
- int cost;
- int idx;
- };
- struct Dsu {
- Dsu(int size) : p(size, -1) {}
- int GetParent(int u) {
- if (p[u] < 0) return u;
- return p[u] = GetParent(p[u]);
- }
- void Union(int u, int v) {
- if (GetParent(u) == GetParent(v)) return;
- int pu = GetParent(u);
- int pv = GetParent(v);
- if (p[pu] > p[pv])
- swap(pu, pv);
- p[pu] += p[pv];
- p[pv] = pu;
- }
- vector<int> p;
- };
- int main() {
- int towns_count, cables_count;
- cin >> towns_count >> cables_count;
- vector <Cable> cables(cables_count);
- int i = 1;
- for (auto& [u, v, cost, idx] : cables) {
- cin >> u >> v >> cost;
- idx = i;
- ++i;
- }
- sort(begin(cables), end(cables), [](const Cable& lhs, const Cable& rhs) {
- return tie(lhs.cost, lhs.u, lhs.v, lhs.idx) < tie(rhs.cost, rhs.u, rhs.v, rhs.idx);
- });
- Dsu dsu(1+ towns_count);
- vector<int> required_cables_idxs;
- int total_cost = 0;
- int required_cabels_count = 0;
- for (const auto[u, v, cost, idx] : cables) {
- if (dsu.GetParent(u) != dsu.GetParent(v)) {
- dsu.Union(u, v);
- total_cost += cost;
- ++required_cabels_count;
- required_cables_idxs.push_back(idx);
- }
- }
- sort(begin(required_cables_idxs), end(required_cables_idxs));
- cout << total_cost << ' ' << required_cabels_count << '\n';
- for (int idx : required_cables_idxs) cout << idx << ' ';
- return 0;
- }
- /*
- test1
- 2 2
- 1 2 3
- 1 2 4
- 3 1
- 1
- test2
- 3 3
- 1 2 5
- 1 3 10
- 3 2 4
- 14 2
- 2 3
- */
Advertisement
Add Comment
Please, Sign In to add comment