最小生成数 克鲁斯卡尔 普里姆 matlab

克鲁斯卡尔:

function   T=MST_Kruskal(G)
n=0;
if  isfield(G,‘w‘)  && ~isempty(G.w)  &&  size(G.w,1)==size(G.w,2)
    W=G.w;n=size(W,1);
end
if  isfield(G,‘e‘)  && ~isempty(G.e)  && size(G.e,2)==3
    E=G.e;  n=max(max(E(:,1:2));
elseif n==0
    error(‘incorrect input argument‘);
else
    E=[];
    for i=1:n
    for j=i+1:n
        if W(i,j)~=0  &&  W(i,j)~=inf
            E=[E;  i  j  W(i,j)];
        end
    end
    end
end

T=[];
m=0;
C=1:n;
while  m<n-1  &&  ~isempty(E)
    e=E(:,3);
    [minW, ind]=min(e);
    v1=E(ind,1);
    v2=E(ind,2);
    if  C(v1)~=C(v2)
        T=[T; E(ind,:)];
        m=m+1;
        C(C==C(v2))=C(v1);
    end
    E(ind,:)=[];
end

  普里姆:

function   T=MST_Prim(G)
n=0;
if  isfield(G,‘w‘)  && ~isempty(G.w)  &&  size(G.w,1)==size(G.w,2)
    W=G.w;n=size(W,1);
end
if  isfield(G,‘e‘)  && ~isempty(G.e)  && size(G.e,2)==3
    E=G.e;  n=max(max(E(:,1:2));
elseif n==0
    error(‘incorrect input argument‘);
else
    E=[];
    for i=1:n
    for j=i+1:n
        if W(i,j)~=0  &&  W(i,j)~=inf
            E=[E;  i  j  W(i,j)];
        end
    end
    end
end

V=1:n;
U=[1];  V=setdiff(V,U);
T=[];

while  length(U)<n
    EUV=[];
    for k=1:size(E,1)
        if  ismember(E(k,1), U) && ismember(E(k,2), U) ||  ~ismember(E(k,1), U) &&  ~ismember(E(k,2), U)
        else
            EUV=[EUV; E(k,:)];
        end
    end

    e=EUV(:,3);
    [minW  ind]=min(e);
    v1=EUV(ind,1);
    v2=EUV(ind,2);
    if  ismember(v1,U)
        U=[U, v2];
    else
        U=[U, v1];
    end
    T=[T; v1 v2 minW];
end

  

原文地址:https://www.cnblogs.com/wander-clouds/p/9351172.html

时间: 2024-10-08 15:34:18

最小生成数 克鲁斯卡尔 普里姆 matlab的相关文章

hduoj-1301 Jungle Roads(最小生成树-克鲁斯卡尔和普里姆求解)

普里姆求解: #include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> #include<string> #include<stack> #include<queue> #include<map> using namespace s

最小生成树算法汇总 (普里姆 &amp;&amp; 克鲁斯卡尔与并查集结合)

最小生成树: 今天研究了一下最小生成树,感觉最小生成树算法与最短路算法 相差不大,从Prim 与 Dijskrs算法可以看出 最小生成树即最小权重生成树,主要适用于 N个点之间 构造N-1线路,使N个点之间任意两点之间都可到达, 但是N个点之间 不构成回路,并且这N-1条线路的权重之和最小即 消耗最小. 注意:在构造最小生成树,加入新的节点时,不仅要保证权重最小,首要条件是 不能构成回路. 以图示为例,构造最小生成树 (一)普里姆   以下步骤 (二) 克鲁斯卡尔 最终的最小生成树 和 普里姆一

普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法

做数据结构的课程设计顺便总结一下这四大算法,本人小白学生一枚, 如果总结的有什么错误,希望能够告知指正 普里姆算法如图所示prim 找出最短的边,再以这条边构成的整体去寻找与之相邻的边,直至连接所有顶点,生成最小生成树,时间复杂度为O(n2) 克鲁斯卡尔算法如图所示kruskal 克鲁斯卡尔算法,假设连通网N=(N,{E}),则令最小生成树的初始状态为只有n个顶点而无边的非连通图T=(V,{}),图中每个顶点 自成一个连通分量.在E中选择代价最小的边,若该边依附的定顶点落在T中不同的连通分量上,

最小生成树(MST)----普里姆(Prim)算法与克鲁斯卡尔(Kruskal)算法

1.概念:给定一个带权的无向连通图,如何选取一棵生成树,使树上所有边上权的总和为最小,这叫最小生成树. 2.应用:例如:要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低.这就需要找到带权的最小生成树. 3.求最小生成树的算法 3.1 普里姆(Prim)算法 方法:从指定顶点开始将它加入集合中,然后将集合内的顶点与集合外的顶点所构成的所有边中选取权值最小的一条边作为生成树

46. 蛤蟆的数据结构笔记之四十六普里姆算法

46. 蛤蟆的数据结构笔记之四十六普里姆算法 本篇名言:"手莫伸 ,伸手必被捉.党与人民在监督 ,万目睽睽难逃脱.汝言惧捉手不伸 ,他道不伸能自觉 , 其实想伸不敢伸 ,人民咫尺手自缩.-- 陈毅" 连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最

普里姆算法-prim

算法代码: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 /* Prim算法生成最小生成树  */ void MiniSpanTree_Prim(MGraph MG) { int min, i, j, k; int adjvex[MAXVEX];/* 

普里姆算法介绍

普里姆(Prim)算法,和克鲁斯卡尔算法一样,是用来求加权连通图的最小生成树的算法. 基本思想 对于图G而言,V是所有顶点的集合:现在,设置两个新的集合U和T,其中U用于存放G的最小生成树中的顶点,T存放G的最小生成树中的边. 从所有u?U,v?(V-U) (V-U表示出去U的所有顶点)的边中选取权值最小的边(u, v),将顶点v加入集合U中,将边(u, v)加入集合T中,如此不断重复,直到U=V为止,最小生成树构造完毕,这时集合T中包含了最小生成树中的所有边. 普里姆算法图解 以上图G4为例,

普里姆Prim算法 - 图解最小生成树

我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.综合以上两个概念,我们可以得出:构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法,这里介绍普里姆算法. 为了能够讲明白这个算法,我们先构造网图的邻接矩阵,

数据结构之最小生成树(普里姆算法)

1)普里姆算法 可取图中任意一个顶点v作为生成树的根,之后若要往生成树上添加顶点w,则在顶点v和顶点w之间必定存在一条边,并且 该边的权值在所有连通顶点v和w之间的边中取值最小.一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上 的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边. 例如:起始生成树上面就一个顶点.为了连通两个集合,在可选的边中,选择权值最小的.需要辅助数组,V-U中所有顶点. 具体实例如下图所示:求下图的最小生成树 我