leetcodealgorithms-templates6-graphs
 
 
 
import { MinPriorityQueue } from '@datastructures-js/priority-queue';
 
// Given a list of edges of a connected undirected graph,
// with nodes numbered from 1 to n,
// return a list edges making up the minimum spanning tree.
function minimumSpanningTree(edges, n) {
    let adj = {};
    for (i = 1; i < n + 1; i++) {
        adj[i] = [];
    }
    for (let edge of edges) {
        let {n1, n2, weight} = edge;
        adj[n1].push([n2, weight]);
        adj[n2].push([n1, weight]);
    }
 
    // Initialize the heap by choosing a single node
    // (in this case 1) and pushing all its neighbors.
    let minHeap = new MinPriorityQueue({
        priority: (item) => item[0]
    });
    for (let neighbor of adj[1]) {
        let node = neighbor[0], weight = neighbor[1];
        minHeap.enqueue([weight, 1, node]);
    }
    let mst = [];
    let visit = new Set();
    visit.add(1);
    while (visit.size() < n) {
        let {w1, n1, n2} = minHeap.dequeue().element;
        if (visit.has(n2)) {
            continue;
        }
        mst.push([n1, n2]);
        visit.add(n2);
        for (let pair of adj[n2]) {
            let {neighbor, weight} = pair;
            if (!visit.has(neighbor)) {
                minHeap.add([weight, n2, neighbor]);
            }
        }
    } 
    return mst;
}