加权无向图应用:
城市之间的飞行时长;站点之间的距离;聚类中的相似度值;设备之间的网线。
生成树:包含加权无向图上所有结点,且边尽量少的子图结构
最⼩⽣成树(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继续执行。