#include <bits/stdc++.h>
using namespace std;
#define int long long
#ifndef ONLINE_JUDGE
#include "algo/debug.h"
#else
#define debug(...) 42
#endif
const int N = 2e5+10;
#define fr(x, y) for(int i = x; i < y; i++)
vector<int> A;
struct Graph {
vector<vector<pair<int, int>>> adj;
Graph(int n) {
adj.resize(n);
}
void add(int x, int y, int w) {
adj[x].push_back({y, w});
adj[y].push_back({x, w});
}
int weight(int x, int y) {
for(auto& nxt : adj[x]) {
if(nxt.first == y) return nxt.second;
}
return -1;
}
};
struct Dsu{
vector<int> par;
vector<int> siz;
Dsu(int n) {
par.resize(n + 1);
siz.resize(n + 1, 1);
for(int i = 0; i <= n; i++) {
par[i] = i;
}
}
int findPar(int x) {
if (par[x] != x)
par[x] = findPar(par[x]);
return par[x];
}
void unite(int x, int y) {
int xP = findPar(x);
int yP = findPar(y);
if(xP == yP) return;
if(siz[xP] > siz[yP]) {
par[yP] = xP;
siz[xP] += siz[yP];
}else {
par[xP] = yP;
siz[yP] += siz[xP];
}
}
};
void kruskal(Graph g) {
int V = g.adj.size();
Dsu dsu(V);
vector<tuple<int, int, int>> edges; // (weight, u, v)
for(int u = 0; u < V; ++u) {
for(auto& [v, w] : g.adj[u]) {
if(u < v) { // to avoid duplicate edges in undirected graph
edges.push_back({w, u, v});
}
}
}
sort(edges.begin(), edges.end());
int mst_cost = 0;
vector<pair<int, int>> mst_edges;
for(auto& [w, u, v] : edges) {
if(dsu.findPar(u) != dsu.findPar(v)) {
dsu.unite(u, v);
mst_edges.push_back({u, v});
mst_cost += w;
}
}
for(auto& [u, v] : mst_edges) {
cout << u << " -- " << v << endl;
}
cout << "MST cost: " << mst_cost << endl;
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
freopen("Error.txt", "w", stderr);
int n = 5;
Graph g(n);
g.add(0, 2, 1);
g.add(0, 1, 2);
g.add(1, 2, 1);
g.add(2, 4, 2);
g.add(4, 3, 1);
g.add(2, 3, 2);
kruskal(g);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojaWZuZGVmIE9OTElORV9KVURHRQojaW5jbHVkZSAiYWxnby9kZWJ1Zy5oIgojZWxzZQojZGVmaW5lIGRlYnVnKC4uLikgNDIKI2VuZGlmCmNvbnN0IGludCBOID0gMmU1KzEwOwojZGVmaW5lIGZyKHgsIHkpIGZvcihpbnQgaSA9IHg7IGkgPCB5OyBpKyspCnZlY3RvcjxpbnQ+IEE7CgpzdHJ1Y3QgR3JhcGggewogICAgdmVjdG9yPHZlY3RvcjxwYWlyPGludCwgaW50Pj4+IGFkajsKICAgIEdyYXBoKGludCBuKSB7CiAgICAgICAgYWRqLnJlc2l6ZShuKTsKICAgIH0KICAgIHZvaWQgYWRkKGludCB4LCBpbnQgeSwgaW50IHcpIHsKICAgICAgICBhZGpbeF0ucHVzaF9iYWNrKHt5LCB3fSk7CiAgICAgICAgYWRqW3ldLnB1c2hfYmFjayh7eCwgd30pOwogICAgfQogICAgaW50IHdlaWdodChpbnQgeCwgaW50IHkpIHsKICAgICAgICBmb3IoYXV0byYgbnh0IDogYWRqW3hdKSB7CiAgICAgICAgICAgIGlmKG54dC5maXJzdCA9PSB5KSByZXR1cm4gbnh0LnNlY29uZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9OwpzdHJ1Y3QgRHN1ewogICAgdmVjdG9yPGludD4gcGFyOwogICAgdmVjdG9yPGludD4gc2l6OwogICAgRHN1KGludCBuKSB7CiAgICAgICAgcGFyLnJlc2l6ZShuICsgMSk7CiAgICAgICAgc2l6LnJlc2l6ZShuICsgMSwgMSk7CiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKICAgICAgICAgICAgcGFyW2ldID0gaTsKICAgICAgICB9CiAgICB9CiAgICBpbnQgZmluZFBhcihpbnQgeCkgewogICAgICAgIGlmIChwYXJbeF0gIT0geCkKICAgICAgICAgICAgcGFyW3hdID0gZmluZFBhcihwYXJbeF0pOwogICAgICAgIHJldHVybiBwYXJbeF07CiAgICB9CiAgICB2b2lkIHVuaXRlKGludCB4LCBpbnQgeSkgewogICAgICAgIGludCB4UCA9IGZpbmRQYXIoeCk7CiAgICAgICAgaW50IHlQID0gZmluZFBhcih5KTsgCiAgICAgICAgaWYoeFAgPT0geVApIHJldHVybjsKICAgICAgICBpZihzaXpbeFBdID4gc2l6W3lQXSkgewogICAgICAgICAgICBwYXJbeVBdID0geFA7CiAgICAgICAgICAgIHNpelt4UF0gKz0gc2l6W3lQXTsKICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgIHBhclt4UF0gPSB5UDsKICAgICAgICAgICAgc2l6W3lQXSArPSBzaXpbeFBdOwogICAgICAgIH0KICAgIH0KfTsKdm9pZCBrcnVza2FsKEdyYXBoIGcpIHsKICAgIGludCBWID0gZy5hZGouc2l6ZSgpOwogICAgRHN1IGRzdShWKTsKICAgIHZlY3Rvcjx0dXBsZTxpbnQsIGludCwgaW50Pj4gZWRnZXM7IC8vICh3ZWlnaHQsIHUsIHYpCgogICAgZm9yKGludCB1ID0gMDsgdSA8IFY7ICsrdSkgewogICAgICAgIGZvcihhdXRvJiBbdiwgd10gOiBnLmFkalt1XSkgewogICAgICAgICAgICBpZih1IDwgdikgeyAvLyB0byBhdm9pZCBkdXBsaWNhdGUgZWRnZXMgaW4gdW5kaXJlY3RlZCBncmFwaAogICAgICAgICAgICAgICAgZWRnZXMucHVzaF9iYWNrKHt3LCB1LCB2fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgc29ydChlZGdlcy5iZWdpbigpLCBlZGdlcy5lbmQoKSk7CgogICAgaW50IG1zdF9jb3N0ID0gMDsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gbXN0X2VkZ2VzOwoKICAgIGZvcihhdXRvJiBbdywgdSwgdl0gOiBlZGdlcykgewogICAgICAgIGlmKGRzdS5maW5kUGFyKHUpICE9IGRzdS5maW5kUGFyKHYpKSB7CiAgICAgICAgICAgIGRzdS51bml0ZSh1LCB2KTsKICAgICAgICAgICAgbXN0X2VkZ2VzLnB1c2hfYmFjayh7dSwgdn0pOwogICAgICAgICAgICBtc3RfY29zdCArPSB3OwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoYXV0byYgW3UsIHZdIDogbXN0X2VkZ2VzKSB7CiAgICAgICAgY291dCA8PCB1IDw8ICIgLS0gIiA8PCB2IDw8IGVuZGw7CiAgICB9CiAgICBjb3V0IDw8ICJNU1QgY29zdDogIiA8PCBtc3RfY29zdCA8PCBlbmRsOwp9CgpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOwogICAgZnJlb3BlbigiRXJyb3IudHh0IiwgInciLCBzdGRlcnIpOwoKICAgIGludCBuID0gNTsKICAgIEdyYXBoIGcobik7CgogICAgZy5hZGQoMCwgMiwgMSk7CiAgICBnLmFkZCgwLCAxLCAyKTsKICAgIGcuYWRkKDEsIDIsIDEpOwogICAgZy5hZGQoMiwgNCwgMik7CiAgICBnLmFkZCg0LCAzLCAxKTsKICAgIGcuYWRkKDIsIDMsIDIpOwoKICAgIGtydXNrYWwoZyk7Cn0=