最小生成树算法详解.ppt

合集下载

最小生成树MinimumSpanningTree

最小生成树MinimumSpanningTree
设邻接矩阵初值:不存在的边其权值为Infinity
8
1、Prim算法
算法求精-初始化
将根r涂红加入红点集U,TE=φ。
对每个白点i (0≤i ≤n-1, i≠r ), i所关联的最短紫边(r,i)的 长度为G[r][i], 这n-1条最短紫边构成了初始的候选轻边集。
因为树边为空,故将T[0..n-2]全部用来存放候选轻边集。
❖设V(G)={0,1,…,n-1}
❖算法的每一步均是在连接红、白点集的紫 边中选一轻边扩充到T(贪心),T从任意 一点r开始(r为根),直至U=V为止。 MST性质保证了贪心选择策略的正确性。
3
1、Prim算法
如何找轻边?
❖可能的紫边集
设红点集|U|=k, 白点集|V-U|=n-k,则可能的紫边 数为:k(n-k)。
//将(u,v)涂红加入树中,白点v加入红点集
ModifyCandidateSet(…);
//根据新红点v调整候选轻边集
}
}
算法终止时U=V,T=(V,TE)
6
1、Prim算法
实例
6 1
5
35 4
05
1
3
27 2
4
5
6
60 5
1
1
3
∞2

4
5
0
151
3
2
5
2 4
4
5
0
151
3
2
5
2 4
4
5
0
151 2
int i, minpos, min=Infinity; for (i=k; i<n-1; i++) //遍历候选集找轻边

02-13.2 最小生成树-PPT

02-13.2 最小生成树-PPT

本章小结
1 深刻理解基本回路、基本回路系统、基本割集、基本割集系统,并且对给定的生成树能 熟练地求出它们。
2 熟练地应用Kruskal算法求最小生成树。关于生成树的思维形式注记图如图所示。
W(TG)=1+3+4+8+9+23=48
算法13.3 (破圈法)
1)令E’=E; 2 选取E’中的一条简单回路C,设C 中权最大的边为e,令E’=E’-{e}; 3 重复步骤2),直到|E’|=|V|-1为止。 不停地选取图G 中的一条简单回路,从回路中删去权值最大的一条边,直 到图中无简单的回路为止。
1)按权值升序将图G 的边排序,得到表L;
2)令S=∅;
3 在表L中依次选取下一条边e,如果e ∉S ,且S ∪{e}构成的 子图是无圈图,则令S=S ∪{e};
4 若|S|=n−1,则算法停止,输出集合S即为所求。否则,转3), 继续遍历表L。 可以证明,算法13.1求得的是图G 的最小生成树。
例13.7
3 若|E(T)|=n−1,算法停止,输出E(T)。否则,转2),继续向树中增加新 结点。
例.8
右左图所示的赋权图G表 示七个城市a,b,c,d, e,f,g及架起城市间直 接通讯线路的预测造价。 试给出一个设计方案使 得各城市间能够通讯并 且总造价最小,并计算 出最小造价。
a
20
b
a
b
23
1
因为它们的加入会形成圈。
(4)此时S中有6条边,满足|S| =n - 1 ,所以算法结束。
得到的最小生成树如图(b)所示,树权为10。
算法13.2 (Prim算法)
设图G有n个结点,按以下步骤可以求得图G的最小生成树。

数据结构15--最小生成树PPT课件

数据结构15--最小生成树PPT课件

proc Union(i,j,c:longint); /*合并i和j所在集合 */
Var x,y:longint;
{ x←top(i); y←top(j); 点j所在子树的根*/
/*分别取出顶点i和顶
if x<>y Then { inc(ans,c);f[y]←x;}; /*若i 和j分属于两棵子树,则该边权计入最小生成树的权和, 两棵子树合并*/
Writeln(ans);
显然, Kruskal算法的效率取决于边数m,因此适用与
稀疏图。
.
②、Prim算法
集合A中的边总是只形成单棵树,每次添加到 树中的边都是使树的权尽可能小的边。
.
设 d[i]—顶点i与生成树相连的最短边长; ba[i]—顶点i在生成树的标志; w[i,j]—(i,j)的边长。若图中不存在边 (i,j),则w[i,j]=∞ min—所有未在生成树的顶点的最小距离 值
top←f[i]; /*返回顶点i所在并查集的代表 顶点*/ };/*top*/
.
通过过程Union(i,j,c)合并顶点i和顶点j所 在的两棵树
现有边权为c的边(i,j)。若该边的两个端点 分属于两棵树,顶点i和顶点j所在子树的根分别 为x和v,则(i,j) 加入最小生成树,合并两棵树 (即顶点i和顶点j所在的并查集)。
for j←1 to n do
if not ba[j]and(d[j]<min) then { k←j;min←d[j] }; /*then*/
if min= maxint then { ans←-1;break;};/*若这样的顶点不存 在,则无解退出*/
ans←ans+min;ba[k]←true;/*最小距离值min计入生成树的权和, 顶点k进入生成树*/

最小生成树问题(共7张PPT)

最小生成树问题(共7张PPT)

个,所以支撑树是有不唯一]。
C n1 m
求最小树的Kruskal算法
赋权的连通图G=(V,E)中m=|E|,n=|V|,
S1:对E中各边的权排序,设 w1≤w2≤…≤wm,wi=w(ei)
S2:初始化: w←0,T←φ,k←1,t←0
S3:若t=n-1则转S6,否则转S4
Y
N
T’←T∪{ek}
T’成圈? N END
Y
T←T+ {ek},
k←k+1 w←w+wk,
t←t+1,k←k+1
用Kruskal算法求最小树
用Kruskal算法(避圈法)求赋权连通图G的最小树
V2
5
V6
Kruskal法盯住边,而Prim法更注意顶点:
T为最小树,w为T的权。
4
T={v1,v2,v3,v5}
Prim法求最小支撑树 E的权排序w1≤w2≤…≤wm w←0,T←φ,k←1,t←0
对要m让条程边序的读边懂长“图排”,序S程3,:序m如个何元判素断排是序否较成好“的圈算”?法谈是何基容于易分,治时策间略、的空快间速复排杂序性(Q绝u不ick应S小or看ting),其时间复杂性是O(m㏒m)。
min S2:初始化:w←0,T←φ,k←1,t←0 设: {w(vv )}w(vv ) 简对称m条最边小的树边或长最排短序树,[管vvm线ij个 铺ST 元设素]。排序较好的i算法j是基于分治策略的快l速排k序(Quick Sorting),其时间复杂性是O(m㏒m)。
S4:若T∪{ek}有圈则k←k+1转S4,否则 转S5
S5: T←T∪{ek},w←w+wk, t←t+1, k←k+1,转S3

《图论最小生成树》课件

《图论最小生成树》课件
图论最小生成树
在计算机科学中,图论最小生成树是一种常见的算法,用于在给定的加权图 中找到一棵包含所有顶点的最小权重树。
什么是图论最小生成树
1 定义
图论最小生成树是指在一个图中,找到一棵 包含所有顶点的且边的权重之和最小的树。
2 应用
最小生成树常用于网络设计、链路优Байду номын сангаас、行 程规划等问题。
如何生成最小生成树
1
Kruskal算法
2
按照边权重递增的顺序选择边,直到最
小生成树中包含所有顶点。
3
Prim算法
从一个顶点开始,逐步扩展最小生成树, 直到包含所有顶点。
其他算法
除了Prim和Kruskal算法,还有其他一些 生成最小生成树的算法,如Boruvka算法 和BFS算法。
最小生成树与带权图
最小生成树算法通常用于带权图,这种图中的边带有权重,代表顶点之间的 关系强度或代价。
应用实例
网络设计
在计算机网络中,最小生成树可用于确定网络拓扑,优化链路和路由。
城市规划
通过最小生成树算法,可以确定城市道路的规划和建设顺序。
行程规划
最小生成树可在旅行规划中,帮助确定最短路径和最优路线。
总结和提高建议
1 重要性
最小生成树在图论和算法设计中扮演着重要的角色。
2 优化算法
不同的最小生成树算法在效率和应用场景上有所不同,需要根据具体情况选择合适的算 法。

《最小生成树》PPT课件_OK

《最小生成树》PPT课件_OK

(2,5) 添加
{1,3},{4, 6},{2,5}
(3,6) 添加
{1,3,4, 6},{2,5}
(1,4) 放弃
因构成回路
(3,4) 放弃
因构成回路
(2,3) 添加
{1,3,4,5,6,2}
9
算法难点及解决方案
• 如何从所有边中选择代价最小的边:
– 用一个优先级队列来实现。将所有的边放入一个优先级 队列,边的优先级就是它的权值。权值越小,优先级越 高。
数据结构 Data Structure 第十三章 最小生成树
1
第13章 最小生成树
• 生成树与最小生成树 • Kruskal算法 • Prim算法 • 算法的正确性
2
生成树
• 生成树是无向连通图的极小连通子图。包含图的 所有 n 个结点,但只含图的 n-1 条边。在生成树 中添加一条边之后,必定会形成回路或环。
23
定理的证明
• 用反证法证明。 • 假定在图G = {V,E } 中,存在一棵不包括代价
• 在一个连通图中,一般边数总比结点数大,所以, Kruskal算法的时间复杂度是O(E|log|E|)。
14
第13章 最小生成树
• 生成树与最小生成树 • Kruskal算法 • Prim算法 • 算法的正确性
15
Prim算法
• 从顶点的角度出发。初始时,顶点集U为空,然 后逐个加入顶点,直到包含所有顶点。
• 如何判断加入一条边后会不会形成回路:
– 用并查集来实现。将一个连通分量表示为并查集中的一 个子集,检查一条边加入后会不会形成回路可以通过对 边的两个端点分别执行Find操作。如果两个Find的结果相 同,则表示两个端点已连通,加入这条边会形成回路, 否则将这条边加入生成树。添加边的操作就是一个Union 操作,将两个端点所属的子集归并起来,表示其中的所 有顶点都已连通。

最小生成树(Kruskal和Prim算法)

最小生成树(Kruskal和Prim算法)

最⼩⽣成树(Kruskal和Prim算法)关于图的⼏个概念定义:关于图的⼏个概念定义:连通图:在⽆向图中,若任意两个顶点vi与vj都有路径相通,则称该⽆向图为连通图。

强连通图:在有向图中,若任意两个顶点vi与vj都有路径相通,则称该有向图为强连通图。

连通⽹:在连通图中,若图的边具有⼀定的意义,每⼀条边都对应着⼀个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通⽹。

⽣成树:⼀个连通图的⽣成树是指⼀个连通⼦图,它含有图中全部n个顶点,但只有⾜以构成⼀棵树的n-1条边。

⼀颗有n个顶点的⽣成树有且仅有n-1条边,如果⽣成树中再添加⼀条边,则必定成环。

最⼩⽣成树:在连通⽹的所有⽣成树中,所有边的代价和最⼩的⽣成树,称为最⼩⽣成树。

构造最⼩⽣成树的准则有3条:(1)必须只使⽤该⽹络中的边来构造最⼩⽣成树。

(2)必须使⽤且仅使⽤n-1条边来连接⽹络中的n个顶点。

(3)不能使⽤产⽣回路的边。

下⾯介绍两种求最⼩⽣成树算法1 Prim(普利姆算法)算法--加点法此算法可以称为“加点法”,每次迭代选择代价最⼩的边对应的点,加⼊到最⼩⽣成树中。

算法从某⼀个顶点s开始,逐渐长⼤覆盖整个连通⽹的所有顶点。

Prim算法从任意⼀个顶点开始,每次选择⼀个与当前顶点集最近的⼀个顶点,并将两顶点之间的边加⼊到树中。

Prim算法在找当前最近顶点时使⽤到了贪婪算法。

实现过程:5int logo[1010];///⽤0和1来表⽰是否被选择过6int map1[1010][1010];7int dis[1010];///记录任意⼀点到这⼀点的最近的距离8int n,m;9int prim()10 {11int i,j,now;12int sum=0;13for(i=1;i<=n;i++)///初始化14 {15 dis[i]=MAX;16 logo[i]=0;17 }18for(i=1;i<=n;i++)19 {20 dis[i]=map1[1][i];21 }22 dis[1]=0;23 logo[1]=1;24for(i=1;i<n;i++)///循环查找25 {26 now=MAX;27int min1=MAX;28for(j=1;j<=n;j++)29 {30if(logo[j]==0&&dis[j]<min1)31 {32 now=j;33 min1=dis[j];34 }35 }36if(now==MAX)///防⽌不成图37 {38break;39 }40 logo[now]=1;41 sum=sum+min1;42for(j=1;j<=n;j++)///填⼊新点后更新最⼩距离,到顶点集的距离43 {44if(logo[j]==0&&dis[j]>map1[now][j])45 {46 dis[j]=map1[now][j];47 }48 }49 }50if(i<n)51 {52 printf("?\n");53 }54else55 {56 printf("%d\n",sum);57 }58 }59int main()60 {61while(scanf("%d%d",&m,&n)!=EOF)///n是点数62 {63if(m==0)64 {65break;66 }67 memset(map1,0x3f3f3f3f,sizeof(map1));///map是邻接矩阵储存图的信息68for(int i=0;i<m;i++)69 {70int a,b,c;71 scanf("%d%d%d",&a,&b,&c);72if(c<map1[a][b])///防⽌出现重边73 {74 map1[a][b]=map1[b][a]=c;75 }76 }77 prim();78 }79return0;80 }邻接表实现:1 #include<stdio.h>2 #include<string.h>3 #include<vector>4 #include<algorithm>5#define INF 0x3f3f3f3f6using namespace std;7struct node8 {9int end;///终点10int power;///权值11 } t;12int n;///n为点数13 vector<node>q[500001];///邻接表储存图的信息14int dis[500001];///距离15int vis[500001];///标记数组16void prime()17 {18int i,len,j,pos,sum,start;19 memset(vis,0,sizeof(vis));20 sum=0;21 start=1;///任意取起点22for(i=0; i<=n; i++)23 {24 dis[i]=INF;25 }26 len=q[start].size();27for(i=0; i<len; i++)///从任意起点开始的dis数组更新28 {29if(q[start][i].power<dis[q[start][i].end])30 {31 dis[q[start][i].end]=q[start][i].power;32 }33 }34 vis[start]=1;35for(j=0; j<n-1; j++)36 {37int pos,min=INF;38for(i=1; i<=n; i++)39 {40if(vis[i]!=0&&dis[i]<min)41 {42 min=dis[i];43 pos=i;///找到未访问节点中权值最⼩的44 }45 }46if(pos==INF)///防⽌不成图47 {48break;49 }50 vis[pos]=1;51 sum=sum+min;52 len=q[pos].size();///再次更新dis数组53for(j=0; j<len; j++)54 {55if(vis[q[pos][j].end]==0&&dis[q[pos][j].end]>q[pos][j].power)56 {57 dis[q[pos][j].end] = q[pos][j].power;58 }59 }60 }61if(j<n)62 {63 printf("?\n");64 }65else66 {67 printf("%d\n",sum);68 }69 }70int main()71 {72int m,i;73int begin,end,power;74int a,b;75while(scanf("%d%d",&n,&m)!=EOF)76 {77for(i=0; i<=n; i++)78 {79 q[i].clear();///将victor数组清空80 }81for(i=0; i<m; i++)82 {83 scanf("%d%d%d",&begin,&end,&power);///输⼊84 t.end=end;85 t.power=power;86 q[begin].push_back(t);87 t.end=begin;///⽆向图88 t.power=power;89 q[end].push_back(t);90 }91 prime();92 }93return0;94 }这⾥再给出⼀个没有使⽤标记数组的代码:int prim(int s){int i,j,sum=0;int now;for(i=1;i<=n;i++){closest[i]=INT_MAX;}for(i=1;i<=n;i++){closest[i]=map[s][i];}closest[s]=0;for(i=1;i<n;i++)//这⾥的i代表的是边数,有n个点就会有n-1条边{int min=INT_MAX;for(j=1;j<=n;j++){if(closest[j]&&closest[j]<min){min=closest[j];now=j;//找到所需的最⼩边}}sum+=min;closest[now]=0;//将找到的边加⼊到最⼩⽣成树之中for(j=1;j<=n;j++)//找到新的点加⼊已选点集合之后,更新该点到未选点集合的距离{if(map[now][j]&&map[now][j]<closest[j]){closest[j]=map[now][j];}}}return sum;}2 Kruskal(克鲁斯卡尔)算法--加边法1.概览 Kruskal算法是⼀种⽤来寻找最⼩⽣成树的算法,在剩下的所有未选取的边中,找最⼩边,如果和已选取的边构成回路,则放弃,选取次⼩边。

最小生成树-数学建模.ppt

最小生成树-数学建模.ppt
用Kruskal算法可求出最小生成树,在前面 给出的Kruskal算法的MATLAB程序中,边权矩阵b 的值改为此处的边权矩阵,顶点数n改为9即可。
上一页 下一页 主 页
T= 7 8 15 12 39 46 47 45 13
c = 4.4300
机器的分组:{3, 9},
{1,2,5},
{4,6,7,8}。
返回
整理边权矩阵
初始化:j0, T, c0, k0; 对所有顶点i ,t(i)i .
B: 图的边权矩阵; T: 生成树的边集; C: 生成树的权; t: 顶点所属子树的编号
jj+1
t(B(1,j))t(B(2,j)) Y
N
TT(B(1,j),B(2,j)), cc+B(3,j),kk+1,i 0
i i+1
引例:计算机网络的线路设计
最小生成树
最大生成树 1) 一个完全图Kn有多少不同 的生成树? 2) 如何求其最小生成树?
引例:计算机网络的线路设计
10个顶点的完全图,其不同的生成树就有 一亿棵。
一般地,n个顶点的完全图,其不同的生成 树个数为nn-2。
30 个 顶 点 的 完 全 图 就 有 3028 个 生 成 树 , 求 最小生成树时用穷举法是无效的。
假设有13种零件,需在9台机器上 加工。在各台机器上加工的零件号在下 表中给出。
范例:制造系统的分组技术
机器 1 2 3 4 5 6 7 8 9
加工 2,3, 2,7, 1,6 3, 3,7, 5 4, 4, 6
的零 7,8, 8, 件 9, 11,1
12, 2
5, 8,9, 10 12,
13
10 10
3

图的最小生成树_prim算法PPT共20页

图的最小生成树_prim算法PPT共20页
图的最小生成树_prim算法值。—— 希腊
12、法律是无私的,对谁都一视同仁。在每件事上,她都不徇私情。—— 托马斯
13、公正的法律限制不了好的自由,因为好人不会去做法律不允许的事 情。——弗劳德
14、法律是为了保护无辜而制定的。——爱略特 15、像房子一样,法律和法律都是相互依存的。——伯克
1、最灵繁的人也看不见自己的背脊。——非洲 2、最困难的事情就是认识自己。——希腊 3、有勇气承担命运这才是英雄好汉。——黑塞 4、与肝胆人共事,无字句处读书。——周恩来 5、阅读使人充实,会谈使人敏捷,写作使人精确。——培根

最小生成树算法详解(课堂PPT)

最小生成树算法详解(课堂PPT)

0 0 0 0 0 {v1,v3,v6,v4,v2,v5}
{}
21
普里姆算法求最小生成树
• 图采用邻接矩阵表示
6 v2
5 3
6 v5
v1 5
1 v4 5
v3 42
6 v6
1
2
graph. arac[][] =
3 4
5
6
123456
∞ 6 1 5∞∞ 6 ∞5∞3 ∞ 1 5∞5 6 4 5 ∞ 5 ∞∞ 2 ∞ 3 6 ∞∞ 6 ∞∞4 2 6 ∞
6
adjvex lowcost
v3 5
0
v6 2
v3 6
0
{v1,v3,v6}
{v2,v4,v5 }
4
adjvex lowcost
v3 5
0
0
v3 6
0
{v1,v3,v6,v4}
{v2,v5 }
2
adjvex lowcost
0
0
0
v2 3
0
{v1,v3,v6,v4,v2}
{v5 }
5
adjvex lowcost
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
6
最小代价生成树
V1
1
普里姆算法求最小生成树:从
V3
生成树中只有一个顶点开始,
到顶点全部进入生成树为止
V1
6
5
1
V2
V4
V3
V5
V6
步骤 (0) (1)
U
V-U
{V1 } { V2 ,V3 ,V4 , V5 ,V6 } {V1 ,V3 } { V2 ,V4 , V5 ,V6 }

最小生成树PPT演示

最小生成树PPT演示

18
克鲁斯卡尔算法
• 克鲁斯卡尔算法从另一途径求网的最小生 成树。假设连通网N=(V,{E}),则令最小生成树 的初始状态为只有n个顶点而无边的非连通 图T=(V,{}),图中每个顶点自成一个连通分量 。在E中选择代价最小的边,若该边依附的 顶点落在T中不同的连通分量上,则将此边 加入到T中,否则舍去此边而选择下一条代 价最小的边。以此类推,直至T中所有顶点 都在同一连通分量上为止。
李昕翼: 撰写报告 提问问题
3
最小连接问题
• 交通网络中,常常关注能把所有站点连接 起来的生成树,使得该生成树各边权值之 和为最小。例如:
• 假设要在某地建造5个工厂,拟修筑道路连接这5 处。经勘探,其道路可按无向边铺设。现在每条 边的长度已经测出并标记在对应边上,如果我们 要求铺设的道路总长度最短,如何铺设?
10
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V3 5 0
6 6
4
V6
v6
V3 4
2
v3
v4
V1 5
v5
V3 6
U
{V1, V3}
V-U
{V2,V4 ,V5,V6}
k
v6
11
V1
6
V2
5
1 5
V3
5
V4
3
V5
i
v2 closedge adjvex lowcost
V3 5
6 6
4
V6
v6
2
v3
v4
V6
v5
V3 6
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
最小代价生成树
V1
1
普里姆算法求最小生成树:从
生成树的代价等于其边上的权值之和。
6 V2 5
V1 5
1
5
V4
V3
36
4
2
V1
6
5
1
V2
V4
V3
V5
6
V6
V2 5
6
4
3
V5
V6
V5
V1
1 V4
V3
4
2
V6
最小代价生成树
两种常用的构造最小生成树的方法: ➢ 普里姆算法(prim) ➢ 克鲁斯卡尔算法( Kruskal)
普里姆(Prim)算法
假设N=(V,E)是连通网,TE是N上最小生成树中边的集合。 算法从U={u0}(u0∈V),TE={}开始,重复执行下述操作:
V3
生成树中只有一个顶点开始,
到顶点全部进入生成树为止
V1
6
5
1
V2
V4
V3
V5
V6
步骤 (0) (1)
U
V-U
{V1 } { V2 ,V3 ,V4 , V5 ,V6 } {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
最小代价生成树
普里姆算法求最小生成树:从生 成树中只有一个顶点开始,到顶 点全部进入生成树为止
V1
1
V2 5
V1 1 V3
4 V6
V1
6
5
V2 5
5
V4
V3
6
4
V5
V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1
1
V2 5
V4
V3
4
2
V6
V1 6
V2 5 V3
6
V5
6
V4 V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
普里姆(Prim)算法
开始 生成树中只放置一个顶点
生成树中顶点数小于n?否

在关联生成树顶点的边中(即边的 一个顶点在生成树中,另一个顶点不在) 取权值最小者
结束
将选中的边加入生成树, 同时将该边的关联顶点加入生成树中
基本要求
从键盘(或数据文件)输入图的信息,用普里姆算法求解给 定无向连通图的最小生成树,最后输出最小生成树中的权值 和所有的边,图的存储结构自行设定。
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
例如 下图的输出为
v1
6
5
v2
1 v4
55
v3
3 6
42
v5 6 v6
weight:15 (v1, v3) (v3, v6) (v6, v4) (v3, v2) (v2, v5) 或者(1, 3) (3, 6) (6, 4) (3, 2) (2, 5)
最小生成树算法
------prim& Kruskal
生成树的概念
生成树
➢ 一个连通图的生成树是一个极小连通子图,它含有图中全 部顶点,但只有足以构成一棵树的n-1条边。
➢ 生成树不唯一
V2
V2
V1
V4
V6 V5
V3 生成树
V1
V4
V3
V2
V6 V5
V1
V4
V3
V2
V6
V5
V1
V4
V3
V6 V5
最小代价生成树
V1
1 V4
V3
4
2
V6
V1
6
5
V2 5 V3
6
V5
6
5
V4
2 V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
在所有u∈U,v∈V-U的边(u,v)中找一条代价最小的边(u0 ,v0),将 其并入集合TE,同时将v0并入U集合。
当U=V则结束,此时TE中必有n-1条边,则T=(V,{TE})为N的最小生 成树。
普里姆算法构造最小生成树的过程是从一个顶点U={u0}作初 态,不断寻找与U中顶点相邻且代价最小的边的另一个顶点, 扩充到U集合直至U=V为止。
V4V33Fra bibliotek42
V5
V6
V1
V2 V3
36
V5
6
V4 V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
(2) {V1 ,V3 ,V6 } { V2 ,V4 , V5 }
(3) {V1 ,V3 ,V6 ,V4 } { V2, V5 }
(4) {V1 ,V3 ,V6 ,V4 ,V2 } { V5 }
(5) {V1 ,V3 ,V6 ,V4 ,V2 ,V5 } { }
最小代价生成树
普里姆算法求最小生成树:从生 成树中只有一个顶点开始,到顶 点全部进入生成树为止
V1
1
V2 5
V4
V3
3
4
2
V5
V6
V1
V2
V4
V3
V5
V6
步骤 U
V-U
最小代价生成树
普里姆算法求最小生成树:从 生成树中只有一个顶点开始, 到顶点全部进入生成树为止
V1
1
V2 5
V4
V3
3
4
2
V5
V6
6 V2 5
V1 5
1
5
V4
V3
36
4
2
V5
6
V6
步骤 U
V-U
(0) {V1 } { V2 ,V3 ,V4 , V5 ,V6 }
(1) {V1 ,V3 } { V2 ,V4 , V5 ,V6 }
相关文档
最新文档