struct Edge { int u; int v; int weight } int compare(Edge e1, Edge e2) { return e1.weight - e2.weight; } void sort((Edge, Edge) -> int cmp, int len, Edge[] list) { for(var i = 1; i < len; i = i + 1;){ var j = i - 1; var toswap = list[i]; while(j >= 0) { if(cmp(list[j], toswap) > 0) { var temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; j = j - 1; } else { j = -1; } } } return; } int[] create_ufind(int len) { var arr = new int[len]; for(var i = 0; i < len; i = i + 1;) { arr[i] = i; } return arr; } void union(int[] comps, int u, int v) { var cU = find(comps, u); var cV = find(comps, v); if(cU == cV) { return; } comps[cU] = cV; return; } int find(int[] comps, int u) { var root = u; while(root != comps[root]) { root = comps[root]; } while(u != root) { var parent = find(comps, comps[u]); comps[u] = root; u = parent; } return root; } Edge[] findMST(Edge[] edges, int m, int n) { sort(compare, m, edges); var uf = create_ufind(n); var result = new Edge[n-1]; var size = 0; var count = 0; while(size < n - 1){ if(find(uf, edges[count].u) != find(uf, edges[count].v)){ result[size] = edges[count]; union(uf, edges[count].u, edges[count].v); size = size + 1; } count = count + 1; } return result; } int program (int argc, string[] argv) { var e1 = new Edge {u = 1; v = 2; weight = 3}; var e2 = new Edge {u = 0; v = 1; weight = 20}; var e3 = new Edge {u = 1; v = 4; weight = 1}; var e4 = new Edge {u = 2; v = 4; weight = 5}; var e5 = new Edge {u = 3; v = 4; weight = 6}; var e6 = new Edge {u = 2; v = 3; weight = 4}; var edges = new Edge[]{e1, e2, e3, e4, e5, e6}; var mst = findMST(edges, 6, 5); for(var i = 0; i < 4; i = i + 1;){ print_string("("); print_int(mst[i].u); print_string(","); print_int(mst[i].v); print_string(","); print_int(mst[i].weight); print_string(") "); } print_string("="); return 0; }