matlab图论实例(二)最小生成树问题——prim 和 Kruskal 算法

这里写图片描述

算法详解请戳

1. prim 算法

  • 算法图解:
    这里写图片描述

  • 变量解释:

    • n 顶点个数
    • a 存储图
    • result 第一、二、三行分别表示生成树边的起点、终点、权集合
    • p 存放图的最小生成树中的顶点
    • tb 存放当前未选择的顶点
    • temp 存放当前最小生成树连通的所有边
    • d 存放最小的边值
    • jb 存放最小的边值中已经选作最小生成树的点的矩阵(也许不止一个)
    • kb 存放最小的边值中未选作最小生成树的点的矩阵(也许不止一个)
    • j 确定已经选作最小生成树的点的矩阵中的第一个点
    • k 确定未被选作最小生成树的点的矩阵中的第一个点
clear;
clc;
n = 7;
a = [0 50 60 inf inf inf inf;
     0 0 inf 65 40 inf inf;
     0 0 0 52 inf inf 45;
     0 0 0 0 50 30 42;
     0 0 0 0 0 70 inf;
     0 0 0 0 0 0 inf;
     0 0 0 0 0 0 0];% 由于 a 是无向图,航路票价沿着正对角线对称,可以只写出右上角
a = a + a';    % 由于票价沿正对角线对称,即完整的 a 为 a + a 的转置
result =[];   % 定义出 result
p =1;   % 当前只有第 1 个点为最小生成树的节点
tb =2:n;   % 当前未作为最小生成树的节点
while length(result) ~= n - 1   % 当生成树的边为 节点数-1 时,即最小生成树生成(n个点 n-1 条边)
    temp = a(p,tb);  % 存放当前最小生成树连通的所有边,用来求最短边
    temp = temp(:);   % 将 temp 转化成 1 列,让求出的最短距离只有一个值
    d = min(temp);  % 求出最短距离
    [jb,kb] = find(a(p,tb)==d);  % 根据最短距离,找出哪些点符合最短距离的情况
    j = p(jb(1));    % 从当前最小生成树中的点中
    k = tb(kb(1));   % 和当前未进入最小生成树的点中挑出第一个点
    result = [result,[j;k;d]];   % 表示生成树边的起点、终点、权集合
    p = [p,k];   % 刚刚选的点进入最小生成树
    tb(find(tb==k)) =[];    % 将进入最小生成树的点剔除掉
end
result

这里写图片描述

2. kruskal 算法(留坑)

  • 算法图解:
    这里写图片描述

  • 变量解释:

猜你喜欢

转载自blog.csdn.net/liyuanyue2017/article/details/82192963
今日推荐