zoukankan      html  css  js  c++  java
  • 克鲁斯卡尔(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. 继续查找,就发现所有的线都会形成环路。最后,上面找到的顶点和线就是最终结果。

  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/3body/p/14607443.html
Copyright © 2011-2022 走看看