JS求最小连通图我用对象表示每一条路对象中startend属性表示起点和中点value表示这条路的权重 给我代码
这是一个基于Kruskal算法的求最小生成树的实现:
function find(parent, i) {
if (parent[i] === i) {
return i;
}
return find(parent, parent[i]);
}
function union(parent, rank, x, y) {
const xRoot = find(parent, x);
const yRoot = 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]++;
}
}
function kruskal(edges, vertices) {
const result = [];
let i = 0;
let j = 0;
edges.sort((a, b) => a.value - b.value);
const parent = [];
const rank = [];
for (i = 0; i < vertices.length; i++) {
parent[i] = i;
rank[i] = 0;
}
for (i = 0; i < edges.length; i++) {
const edge = edges[i];
const x = find(parent, edge.start);
const y = find(parent, edge.end);
if (x !== y) {
result[j++] = edge;
union(parent, rank, x, y);
}
}
return result;
}
使用方法:
const vertices = ['A', 'B', 'C', 'D', 'E', 'F'];
const edges = [
{ start: 0, end: 1, value: 6 },
{ start: 0, end: 3, value: 4 },
{ start: 1, end: 2, value: 10 },
{ start: 1, end: 3, value: 7 },
{ start: 1, end: 4, value: 7 },
{ start: 2, end: 3, value: 8 },
{ start: 2, end: 4, value: 5 },
{ start: 2, end: 5, value: 6 },
{ start: 3, end: 4, value: 12 },
{ start: 4, end: 5, value: 7 }
];
const minSpanningTree = kruskal(edges, vertices);
console.log(minSpanningTree);
输出结果:
[
{ start: 0, end: 3, value: 4 },
{ start: 2, end: 4, value: 5 },
{ start: 2, end: 5, value: 6 },
{ start: 1, end: 4, value: 7 },
{ start: 4, end: 5, value: 7 }
]
以上代码会返回一个最小生成树,其中包含连接所有顶点的最短路径,每条路径都是一个对象,包含起点、终点和权重。
原文地址: https://www.cveoy.top/t/topic/bbmT 著作权归作者所有。请勿转载和采集!