#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;
/*
PRIM-MST(G)
1 let V be the number of vertices in G
2 for each u in G.V
3 key[u] ← ∞
4 parent[u] ← NIL
5 inMST[u] ← FALSE
6 key[0] ← 0
7 Q ← empty min-priority queue
8 INSERT(Q, (0, 0, NIL)) ▹ (key, vertex, parent)
9 MST ← empty list
10 total_weight ← 0
11 while Q is not empty
12 (w, u, p) ← EXTRACT-MIN(Q)
13 if inMST[u] = TRUE
14 continue
15 inMST[u] ← TRUE
16 if p ≠ NIL
17 ADD (u, p) to MST
18 total_weight ← total_weight + w
19 for each (v, weight) in G.Adj[u]
20 if inMST[v] = FALSE
21 INSERT(Q, (weight, v, u))
22 for each (u, p) in MST
23 print u -- p
24 print "MST cost: ", total_weight
*/
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;
}
};
void prims(Graph g) {
int V = g.adj.size();
priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> pq;
pq.push({0, 0, -1}); // (wt, node, parent)
vector<int> vis(V + 1, 0);
int sum = 0;
vector<pair<int, int>> mst;
while(!pq.empty()) {
auto [wt, nd, par] = pq.top();
pq.pop();
if(vis[nd]) continue;
vis[nd] = 1;
if(par != -1) {
sum += wt;
mst.push_back({nd, par});
}
for(auto& nxt: g.adj[nd]) {
if(!vis[nxt.first]) {
pq.push({nxt.second, nxt.first, nd});
}
}
}
for(auto& edge : mst) {
cout << edge.first << " -- " << edge.second << endl;
}
cout << "MST cost: " << sum << endl;
}
signed main() {
ios_base::sync_with_stdio(false); cin.tie(NULL);
freopen("Error.txt", "w", stderr);
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
int n = 5;
Graph g(n);
// {u, v, wt}
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);
prims(g);
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojaWZuZGVmIE9OTElORV9KVURHRQojaW5jbHVkZSAiYWxnby9kZWJ1Zy5oIgojZWxzZQojZGVmaW5lIGRlYnVnKC4uLikgNDIKI2VuZGlmCmNvbnN0IGludCBOID0gMmU1KzEwOwojZGVmaW5lIGZyKHgsIHkpIGZvcihpbnQgaSA9IHg7IGkgPCB5OyBpKyspCnZlY3RvcjxpbnQ+IEE7Ci8qClBSSU0tTVNUKEcpCjEgICAgbGV0IFYgYmUgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiBHCjIgICAgZm9yIGVhY2ggdSBpbiBHLlYKMyAgICAgICAga2V5W3VdIOKGkCDiiJ4KNCAgICAgICAgcGFyZW50W3VdIOKGkCBOSUwKNSAgICAgICAgaW5NU1RbdV0g4oaQIEZBTFNFCjYgICAga2V5WzBdIOKGkCAwCgo3ICAgIFEg4oaQIGVtcHR5IG1pbi1wcmlvcml0eSBxdWV1ZQo4ICAgIElOU0VSVChRLCAoMCwgMCwgTklMKSkgICAg4pa5IChrZXksIHZlcnRleCwgcGFyZW50KQoKOSAgICBNU1Qg4oaQIGVtcHR5IGxpc3QKMTAgICB0b3RhbF93ZWlnaHQg4oaQIDAKCjExICAgd2hpbGUgUSBpcyBub3QgZW1wdHkKMTIgICAgICAgKHcsIHUsIHApIOKGkCBFWFRSQUNULU1JTihRKQoxMyAgICAgICBpZiBpbk1TVFt1XSA9IFRSVUUKMTQgICAgICAgICAgIGNvbnRpbnVlCjE1ICAgICAgIGluTVNUW3VdIOKGkCBUUlVFCjE2ICAgICAgIGlmIHAg4omgIE5JTAoxNyAgICAgICAgICAgQUREICh1LCBwKSB0byBNU1QKMTggICAgICAgICAgIHRvdGFsX3dlaWdodCDihpAgdG90YWxfd2VpZ2h0ICsgdwoKMTkgICAgICAgZm9yIGVhY2ggKHYsIHdlaWdodCkgaW4gRy5BZGpbdV0KMjAgICAgICAgICAgIGlmIGluTVNUW3ZdID0gRkFMU0UKMjEgICAgICAgICAgICAgICBJTlNFUlQoUSwgKHdlaWdodCwgdiwgdSkpCgoyMiAgIGZvciBlYWNoICh1LCBwKSBpbiBNU1QKMjMgICAgICAgcHJpbnQgdSAtLSBwCgoyNCAgIHByaW50ICJNU1QgY29zdDogIiwgdG90YWxfd2VpZ2h0CiovCnN0cnVjdCBHcmFwaCB7CiAgICB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LCBpbnQ+Pj4gYWRqOwogICAgR3JhcGgoaW50IG4pIHsKICAgICAgICBhZGoucmVzaXplKG4pOwogICAgfQogICAgdm9pZCBhZGQoaW50IHgsIGludCB5LCBpbnQgdykgewogICAgICAgIGFkalt4XS5wdXNoX2JhY2soe3ksIHd9KTsKICAgICAgICBhZGpbeV0ucHVzaF9iYWNrKHt4LCB3fSk7CiAgICB9CiAgICBpbnQgd2VpZ2h0KGludCB4LCBpbnQgeSkgewogICAgICAgIGZvcihhdXRvJiBueHQgOiBhZGpbeF0pIHsKICAgICAgICAgICAgaWYobnh0LmZpcnN0ID09IHkpIHJldHVybiBueHQuc2Vjb25kOwogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9Cn07Cgp2b2lkIHByaW1zKEdyYXBoIGcpIHsKICAgIGludCBWID0gZy5hZGouc2l6ZSgpOwogICAgcHJpb3JpdHlfcXVldWU8dHVwbGU8aW50LCBpbnQsIGludD4sIHZlY3Rvcjx0dXBsZTxpbnQsIGludCwgaW50Pj4sIGdyZWF0ZXI8dHVwbGU8aW50LCBpbnQsIGludD4+PiBwcTsKICAgIHBxLnB1c2goezAsIDAsIC0xfSk7IC8vICh3dCwgbm9kZSwgcGFyZW50KQogICAgCiAgICB2ZWN0b3I8aW50PiB2aXMoViArIDEsIDApOwogICAgaW50IHN1bSA9IDA7CiAgICB2ZWN0b3I8cGFpcjxpbnQsIGludD4+IG1zdDsKCiAgICB3aGlsZSghcHEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gW3d0LCBuZCwgcGFyXSA9IHBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwogICAgICAgIGlmKHZpc1tuZF0pIGNvbnRpbnVlOwogICAgICAgIHZpc1tuZF0gPSAxOwogICAgICAgIGlmKHBhciAhPSAtMSkgewogICAgICAgICAgICBzdW0gKz0gd3Q7CiAgICAgICAgICAgIG1zdC5wdXNoX2JhY2soe25kLCBwYXJ9KTsKICAgICAgICB9CiAgICAgICAgZm9yKGF1dG8mIG54dDogZy5hZGpbbmRdKSB7CiAgICAgICAgICAgIGlmKCF2aXNbbnh0LmZpcnN0XSkgewogICAgICAgICAgICAgICAgcHEucHVzaCh7bnh0LnNlY29uZCwgbnh0LmZpcnN0LCBuZH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZvcihhdXRvJiBlZGdlIDogbXN0KSB7CiAgICAgICAgY291dCA8PCBlZGdlLmZpcnN0IDw8ICIgLS0gIiA8PCBlZGdlLnNlY29uZCA8PCBlbmRsOwogICAgfQogICAgY291dCA8PCAiTVNUIGNvc3Q6ICIgPDwgc3VtIDw8IGVuZGw7Cn0KCgpzaWduZWQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKE5VTEwpOwogICAgZnJlb3BlbigiRXJyb3IudHh0IiwgInciLCBzdGRlcnIpOwogICAgLy9mcmVvcGVuKCJpbnB1dC50eHQiLCAiciIsIHN0ZGluKTsKICAgIC8vZnJlb3Blbigib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIGludCBuID0gNTsKICAgIEdyYXBoIGcobik7CgogICAgLy8ge3UsIHYsIHd0fQogICAgZy5hZGQoMCwgMiwgMSk7CiAgICBnLmFkZCgwLCAxLCAyKTsKICAgIGcuYWRkKDEsIDIsIDEpOwogICAgZy5hZGQoMiwgNCwgMik7CiAgICBnLmFkZCg0LCAzLCAxKTsKICAgIGcuYWRkKDIsIDMsIDIpOwoKICAgIHByaW1zKGcpOwoKfQ==