这是一个基于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 }
]

以上代码会返回一个最小生成树,其中包含连接所有顶点的最短路径,每条路径都是一个对象,包含起点、终点和权重。

JS求最小连通图我用对象表示每一条路对象中startend属性表示起点和中点value表示这条路的权重 给我代码

原文地址: https://www.cveoy.top/t/topic/bbmT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录