const graph = {
0: [{node:1, weight:2}, {node:3, weight:6}],
1: [{node:0, weight:2}, {node:2, weight:3}, {node:3, weight:8}],
2: [{node:1, weight:3}, {node:3, weight:7}],
3: [{node:0, weight:6}, {node:1, weight:8}, {node:2, weight:7}]
};
function primMST(graph) {
const mst = [];
const visited = new Set();
const edges = [];
visited.add(0);
graph[0].forEach(e => edges.push({from:0, to:e.node, weight:e.weight}));
while (visited.size < Object.keys(graph).length) {
edges.sort((a,b) => a.weight - b.weight);
let edge = null;
while (edges.length) {
const e = edges.shift();
if (!visited.has(e.to)) {
edge = e;
break;
}
}
if (!edge) break;
mst.push(edge);
visited.add(edge.to);
graph[edge.to].forEach(e => {
if (!visited.has(e.node)) {
edges.push({from: edge.to, to: e.node, weight: e.weight});
}
});
}
return mst;
}
const result = primMST(graph);
result.forEach(e => console.log(`${e.from} -> ${e.to} (weight ${e.weight})`));Prim's algorithm starts at node 0. It picks edge 0->1 (weight 2) first, then 1->2 (weight 3), and finally 0->3 (weight 6) to connect all nodes with minimum total weight.
Prim's algorithm always adds the smallest edge that connects a node already in the MST to a node not yet included, ensuring the MST grows without cycles and with minimum total weight.
const graph = {
0: [{node:1, weight:4}],
1: [{node:0, weight:4}, {node:2, weight:1}],
2: undefined
};
function primMST(graph) {
const mst = [];
const visited = new Set();
const edges = [];
visited.add(0);
graph[0].forEach(e => edges.push({from:0, to:e.node, weight:e.weight}));
while (visited.size < Object.keys(graph).length) {
edges.sort((a,b) => a.weight - b.weight);
let edge = null;
while (edges.length) {
const e = edges.shift();
if (!visited.has(e.to)) {
edge = e;
break;
}
}
if (!edge) break;
mst.push(edge);
visited.add(edge.to);
graph[edge.to].forEach(e => {
if (!visited.has(e.node)) {
edges.push({from: edge.to, to: e.node, weight: e.weight});
}
});
}
return mst;
}
primMST(graph);Node 2 has neighbors defined, but if the graph misses any node's adjacency list, accessing graph[edge.to] may be undefined, causing a TypeError when calling forEach.
const graph = {
0: [{node:1, weight:10}, {node:2, weight:6}, {node:3, weight:5}],
1: [{node:0, weight:10}, {node:3, weight:15}],
2: [{node:0, weight:6}, {node:3, weight:4}],
3: [{node:0, weight:5}, {node:1, weight:15}, {node:2, weight:4}]
};Prim's algorithm picks edges with weights 5 (0->3), 4 (3->2), and 10 (0->1). Total weight = 5 + 4 + 10 = 19.
const graph = {
0: [{node:1, weight:1}],
1: [{node:0, weight:1}],
2: [{node:3, weight:2}],
3: [{node:2, weight:2}]
};
function primMST(graph) {
const mst = [];
const visited = new Set();
const edges = [];
visited.add(0);
graph[0].forEach(e => edges.push({from:0, to:e.node, weight:e.weight}));
while (visited.size < Object.keys(graph).length) {
edges.sort((a,b) => a.weight - b.weight);
let edge = null;
while (edges.length) {
const e = edges.shift();
if (!visited.has(e.to)) {
edge = e;
break;
}
}
if (!edge) break;
mst.push(edge);
visited.add(edge.to);
graph[edge.to].forEach(e => {
if (!visited.has(e.node)) {
edges.push({from: edge.to, to: e.node, weight: e.weight});
}
});
}
return mst;
}
const result = primMST(graph);
result.forEach(e => console.log(`${e.from} -> ${e.to} (weight ${e.weight})`));Prim's algorithm starting at node 0 only visits nodes 0 and 1 because nodes 2 and 3 are disconnected. So only edge 0->1 is included in the MST.
