图——最小生成树

加权无向图应用:
       城市之间的飞行时长;站点之间的距离;聚类中的相似度值;设备之间的网线。

生成树:包含加权无向图上所有结点,且边尽量少的子图结构

最⼩⽣成树(Minimum Spanning Trees, MST)——生成树中边权重和最小的生成树

        需要注意的是:最小生成树可能不唯一

最小生成树算法1——Prim算法

算法流程:
      Step 0: 任选一个结点𝑟,得到集合 𝑆 = 𝑟 和𝐴 = ∅;
      Step 1: 找到横跨分割 𝑆, 𝑉 − 𝑆 轻边,将其加入到𝐴 ,并将其 𝑉 − 𝑆 中的顶点加入到集合𝑆;
      Step 2: 如果 𝑉 − 𝑆 = ∅,则输出MST(𝑆, 𝐴),否则,继续回到Step 1继续执行

Prim(G, w, r)
输入: G:图  W:图中边的权重  r:初始结点
Input: A graph G, a matrix w representing the weights between vertices in G, the algorithm will start at root vertex r
Output: None
步骤1:构建三个一维数组color[维度=结点的个数]:标记结点颜色,key[维度=结点的个数];边的权重,pred[维度=结点的个数] :结点父节点
Let 𝑐𝑜𝑙𝑜𝑟[1…|V|],𝑘𝑒𝑦[1…|V|],𝑝𝑟𝑒𝑑[1…|V|] be new arrays;
步骤2:对一维数组color,key进行初始化
for 𝑢 ∈ 𝑉 do
    𝑐𝑜𝑙𝑜𝑟[𝑢] ← WHITE, 𝑘𝑒𝑦[𝑢] ← +∞;   
end
步骤3:跟结点r
𝑘𝑒𝑦 [𝑟] ← 0, 𝑝𝑟𝑒𝑑 [𝑟] ← NULL; 
步骤4:构建优先队列Q,将v加入队列
𝑄 ← new PriQueue(V);   // put vertices in Q
While 𝑄 𝑖𝑠 𝑛𝑜𝑛𝑒𝑚𝑝𝑡𝑦 do
    𝑢 ← 𝑄.Extract-Min(); // lightest edge
    for 𝑣 ∈ 𝑎𝑑𝑗[𝑢] do
        if (𝑐𝑜𝑙𝑜𝑟[𝑣] ← 𝑊𝐻𝐼𝑇𝐸)&&(𝑤[ 𝑢, 𝑣] < 𝑘𝑒𝑦[𝑣]) then
            𝑘𝑒𝑦 [𝑣] ← 𝑤 [𝑢, 𝑣] ;   // new lightest edge
            𝑄.Decrease-Key(𝑣, 𝑘𝑒𝑦[𝑣]);
            𝑝𝑟𝑒𝑑 [𝑣] ← 𝑢;
        end
    end
    𝑐𝑜𝑙𝑜𝑟[𝑢] ← BLACK;
end

最小生成树算法2——Kruskal算法

算法流程:

    Step 0: 设𝐴 = ∅,𝐹 = 𝐸(即所有边的集合);
    Step 1: 从森林𝐹中选择权重最小的边𝑒加入𝐴中,并判断是否形成环:
                 如果不形成环,则把𝑒从中森林𝐹删除,加入到集合𝐴中;
                 如果形成环,直接把𝑒从中森林𝐹删除;
    Step 2: 如果𝐹 ≠ ∅,则输出MST(𝑉, 𝐴),否则,继续回到Step 1继续执行。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值