2026-01-04 20:41:26 +09:00

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());