121 lines
2.1 KiB
Text
121 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;
|
||
|
|
}
|