js实现克鲁斯卡尔算法
时间: 2023-09-18 13:06:17 浏览: 157
### 回答1:
克鲁斯卡尔算法是一种用于构造最小生成树的算法。下面是一种在 JavaScript 中实现克鲁斯卡尔算法的方法:
```
function kruskal(edges, nodes) {
// 将边排序,从小到大
edges.sort((a, b) => a.weight - b.weight);
let mst = [];
let parent = [];
// 初始化每个结点的父亲为自己
for (let i = 0; i < nodes.length; i++) {
parent[nodes[i]] = nodes[i];
}
for (let i = 0; i < edges.length; i++) {
let n1 = edges[i].start;
let n2 = edges[i].end;
let w = edges[i].weight;
let root1 = find(n1, parent);
let root2 = find(n2, parent);
// 如果两个结点的祖先不同,说明加入这条边不会形成环
if (root1 !== root2) {
mst.push(edges[i]);
parent[root1] = root2;
}
}
return mst;
}
// 寻找结点的祖先
function find(node, parent) {
if (parent[node] === node) {
return node;
}
return find(parent[node], parent);
}
```
使用方法:
```
let edges = [
{start: "A", end: "B", weight: 2},
{start: "A", end: "C", weight: 3},
{start: "B", end: "C", weight: 5},
{start: "B", end: "D", weight: 1}
];
let nodes = ["A", "B", "C", "D"];
let mst = kruskal(edges, nodes);
console.log(mst);
// 输出:[{start: "B", end: "D", weight: 1}, {start: "A", end: "B", weight: 2}, {start: "A", end: "C", weight: 3}]
```
希望这段代码能对你有所帮助。
### 回答2:
Kruskal算法是用来求解最小生成树的经典算法之一。下面将简要介绍如何使用JavaScript实现Kruskal算法。
首先,我们需要定义一个Graph类来表示图的结构。该类应该包含以下方法:
1. addEdge(v1, v2, weight) - 在图中添加一条边,并指定其两个顶点v1和v2,以及其权重。
2. find(parent, i) - 用于查找一个顶点的父节点。
3. union(parent, rank, x, y) - 用于将两个顶点所在的集合合并。
4. kruskalMST() - 用于实现Kruskal算法的主要方法,返回最小生成树的边集。
在kruskalMST方法中,我们首先将所有的边按照权重进行排序。然后,我们依次考虑每一条边,如果该边连接的两个顶点不在同一个集合中,则将其加入最小生成树的边集,并将这两个顶点的集合合并。
以下是JavaScript实现Kruskal算法的示例代码:
```javascript
class Graph {
constructor(numOfVertices) {
this.numOfVertices = numOfVertices;
this.graph = [];
}
addEdge(v1, v2, weight) {
this.graph.push([v1, v2, weight]);
}
find(parent, i) {
if (parent[i] === i)
return i;
return this.find(parent, parent[i]);
}
union(parent, rank, x, y) {
let xroot = this.find(parent, x);
let yroot = this.find(parent, y);
if (rank[xroot] < rank[yroot])
parent[xroot] = yroot;
else if (rank[xroot] > rank[yroot])
parent[yroot] = xroot;
else {
parent[yroot] = xroot;
rank[xroot]++;
}
}
kruskalMST() {
let result = [];
let i = 0;
let e = 0;
this.graph.sort((a, b) => a[2] - b[2]);
let parent = [];
let rank = [];
for (let v = 0; v < this.numOfVertices; v++) {
parent[v] = v;
rank[v] = 0;
}
while (e < this.numOfVertices - 1) {
let [v1, v2, weight] = this.graph[i];
i++;
let x = this.find(parent, v1);
let y = this.find(parent, v2);
if (x !== y) {
e++;
result.push([v1, v2, weight]);
this.union(parent, rank, x, y);
}
}
return result;
}
}
// 示例用法
let g = new Graph(4);
g.addEdge(0, 1, 10);
g.addEdge(0, 2, 6);
g.addEdge(0, 3, 5);
g.addEdge(1, 3, 15);
g.addEdge(2, 3, 4);
let mst = g.kruskalMST();
console.log("最小生成树的边集:");
for (let [v1, v2, weight] of mst) {
console.log(v1 + " -- " + v2 + " : " + weight);
}
```
上述代码实现了Kruskal算法,并输出最小生成树的边集。运行代码将输出以下结果:
```
最小生成树的边集:
2 -- 3 : 4
0 -- 3 : 5
0 -- 1 : 10
```
### 回答3:
克鲁斯卡尔算法是一种常用于求解最小生成树的算法。下面是使用 JavaScript 实现克鲁斯卡尔算法的示例代码:
```javascript
// 定义边的数据结构
class Edge {
constructor(start, end, weight) {
this.start = start; // 起始点
this.end = end; // 结束点
this.weight = weight; // 权重
}
}
// 定义并查集数据结构
class UnionFind {
constructor(n) {
this.parent = new Array(n);
this.rank = new Array(n).fill(0);
for (let i = 0; i < n; i++) {
this.parent[i] = i;
}
}
find(x) {
if (this.parent[x] !== x) {
this.parent[x] = this.find(this.parent[x]);
}
return this.parent[x];
}
union(x, y) {
let rootX = this.find(x);
let rootY = this.find(y);
if (rootX === rootY) {
return;
}
if (this.rank[rootX] > this.rank[rootY]) {
this.parent[rootY] = rootX;
} else if (this.rank[rootX] < this.rank[rootY]) {
this.parent[rootX] = rootY;
} else {
this.parent[rootY] = rootX;
this.rank[rootX]++;
}
}
}
// 克鲁斯卡尔算法
function kruskal(edges, n) {
edges.sort((a, b) => a.weight - b.weight); // 根据权重从小到大排序
let uf = new UnionFind(n); // 初始化并查集
let result = [];
for (let i = 0; i < edges.length; i++) {
let { start, end, weight } = edges[i];
if (uf.find(start) !== uf.find(end)) {
uf.union(start, end);
result.push(edges[i]);
}
}
return result;
}
// 示例用法
let edges = [
new Edge(0, 1, 7),
new Edge(0, 3, 5),
new Edge(1, 2, 8),
new Edge(1, 3, 9),
new Edge(1, 4, 7),
new Edge(2, 4, 5),
new Edge(3, 4, 15),
new Edge(3, 5, 6),
new Edge(4, 5, 8),
new Edge(4, 6, 9),
new Edge(5, 6, 11),
];
let n = 7; // 顶点数
let result = kruskal(edges, n);
console.log(result); // 输出最小生成树的边集合
```
上述代码中,首先定义了边的数据结构 `Edge` ,并查集数据结构 `UnionFind` 。然后定义了 `kruskal` 方法实现克鲁斯卡尔算法。最后给出一个示例用法,输入边的集合和顶点数,输出最小生成树的边集合。
阅读全文