49 lines
1.1 KiB
TypeScript
49 lines
1.1 KiB
TypeScript
export {};
|
|
const input = require("fs").readFileSync(0).toString().trim().split("\n");
|
|
const [V, E]: number[] = input[0].split(" ").map(Number);
|
|
|
|
let edges: number[][] = [];
|
|
for(let edge of input.slice(1)) edges.push(edge.split(" ").map(Number));
|
|
|
|
let parent: number[] = Array.from({length: V+1}, (_, i) => i);
|
|
let rank: number[] = new Array(V+1).fill(0);
|
|
|
|
const find = (x: number): number => {
|
|
if(x !== parent[x]) return parent[x] = find(parent[x]);
|
|
return parent[x];
|
|
}
|
|
|
|
const union = (x: number, y: number) => {
|
|
x = find(x);
|
|
y = find(y);
|
|
|
|
if(x === y) return;
|
|
|
|
if(rank[x] < rank[y]) [x, y] = [y, x];
|
|
|
|
parent[y] = x;
|
|
if(rank[x] === rank[y]) rank[x]++;
|
|
}
|
|
|
|
const kruskal = (): number => {
|
|
edges.sort((a,b) => a[2] - b[2]);
|
|
|
|
let total_weight = 0;
|
|
let edge_count = 0;
|
|
|
|
for(let edge of edges) {
|
|
const [u, v, w]: number[] = edge;
|
|
|
|
if(find(u) !== find(v)) {
|
|
union(u, v);
|
|
total_weight += w;
|
|
edge_count += 1;
|
|
|
|
if(edge_count === V-1) break;
|
|
}
|
|
}
|
|
|
|
return total_weight;
|
|
}
|
|
|
|
console.log(kruskal()); |