再看最后一眼青春的星空

灿烂火光就像盛夏的烟火

欢送挣扎万年文明的巅峰

我们啊

将变星辰永远飘在黑暗宇宙

这个男人来自三体

Tirion

导航

克鲁斯卡尔(Kruskal)算法详解


将网构造为图中右边的边集数组结构,并且对它们按权值从小到大排序。如:

const graph = [
  {
    begin: 4,
    end: 7,
    weight: 7,
  },
  {
    begin: 2,
    end: 8,
    weight: 8,
  },
];
注意在无向图中,创建此结构时,每条边的 begin 值应该比 end 小,这样在后面查找是否形成环路的时候会更方便。

查找过程如下图所示




概述:通过遍历上面的边集数据结构,从最短的边开始查找,找到边和顶点并记录;继续查找第二短的边和顶点并记录;以此类推;注意在找到一条边时需要查看其两个顶点是否都在已找到的顶点中,如果都在则需要判断这条边是否会形成环路,如果会形成环路则跳过此边继续查找;最终所有的边遍历完成并且没有环路,得到最小生成树。

查找过程详解:

  1. 这里有9个顶点则创建一个长度为9的数组[null,null,null,null,null,null,null,null,null],数组的索引表示开始节点,值表示结束节点。这个数组是用于查找是否形成环路的重要结构。
  2. 首先我们找到最短的边长7,顶点为4-7,那么我们就在数组中将下标为4的值改为7,表示顶点4入顶点7出。[null,null,null,null,7,null,null,null,null]
  3. 然后找到边长8,顶点为2-8,得到顶点2入顶点8出。[null,null,8,null,7,null,null,null,null]
  4. 继续找到边长10,得到:[1,null,8,null,7,null,null,null,null]
  5. 继续找到边长11,发现边长11的顶点为0-5,而数组中顶点0已有值,那么我们就取其值1,将数组索引1的值改为5,得到:[1,5,8,null,7,null,null,null,null]。也表示从顶点1入可以从顶点5出。
  6. 继续找到边长12,顶点为1-8,从索引1得到5,然后索引5改为8得到:[1,5,8,null,7,8,null,null,null]
  7. 继续找到边长16,有两条,我们分别处理。1-6的,通过索引1得到5,通过索引5得到8,然后将索引8改为6得到:[1,5,8,null,7,8,null,null,6]。另一条3-7,得到:[1,5,8,7,7,8,null,null,6]
  8. 继续找边长17,顶点为5-6,通过索引5得到8,索引8得到6,那么我们将索引6设置为6吗?当然不行,这样就会得到从顶点6入又从顶点6出,自己指向自己,这就形成环路了!所以,边长17这条线pass!
  9. 继续找边长19,顶点为6和7,得到:[1,5,8,7,7,8,7,null,6]
  10. 继续查找,就发现所有的线都会形成环路。最后,上面找到的顶点和线就是最终结果。

posted on 2021-04-01 17:46  Tirion  阅读(939)  评论(0编辑  收藏  举报

The Man from 3body