CS153/hw5/hw5programs/jacbrad_kruskal.oat
jmug cfe502c598 Add all the assignment code.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 18:59:28 -08:00

120 lines
2.1 KiB
Text

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;
}