《算法导论》学习总结 — XX.第23章 最小生成树
一、什么叫最小生成树
一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树。
二、为什么要研究最小生成树问题
《算法导论》上举了电子线路设计的例子。而在经济学、生物学中也常应用最小生成树。
三、如何求一个无向连通图的最小生成树
《算法导论》中提取讲解了两种得到最小生成树的算法,一是Kruskal算法,另一种是Prim算法。这两种算法都使用了贪心策略。
先说明几个概念:
安全边:A是G的某最小生成树的子集,如果AU{(u,v)}仍是G的某最小生成树的子集,则(u,v)是安全边;
割:无向图G=(V, E)对V一个划分(S, V-S);
边(u,v)通过割(S,V-S):(u,v)一个顶点位于S中,另一个顶点位于V-S中;
不妨害A的割:A中没有任意一条边通过该割;
轻边(light edge):通过割的所有边中权值最小的(可能有多条)。
生成最小生成树的基本代码结构是:
- GENERIC-MST(G, w)
- A=空集
- while A does not form a spanning tree
- do find an edge(u,v) that is safe for A
- A=AU{(u,v)}
- return A
于是关键就在于找安全边。
定理(《算法导论》中定理23.1)(以白话阐述):G=(V,E) 是个无向连通加权图。A 是 E 的一个子集,它包含于 G 的某个最小生成树中。设割 (S, V-S) 是G的任意一个不妨害A的割(就是说A中任何一条边的两个端点要么全在S中,要么全在V-S中),边(u,v)是通过割(S,V-s)的一条轻边(就是说(u,v)是所有端点分布于S和V-S的边中权值最小的),则(u,v)对集合A是安全的。
推论:A是G=(V,E)的某个最小生成树的子集。G(A)=(V,A)是图G的一个森林(只有A集合中的边),C=(Vc, Ec)为G(A)的一个连通分支(森林中的树)。如果边(u,v)是连接C和G(A)中其他某连通分支的一条轻边,则(u,v)对集合A来说是安全的。
1. Kruskal 算法
- MST-KRUSKAL(G, w)
- A=空集
- for each vertex v∈V[G]
- do MAKE_SET(v)
- sort the edges of E into nondescreasing order by weight w
- for each edge(u,v)∈E, take in nondescreasing order by weight
- do if FIND-SET(u) != FIND-SET(v) // 如果u和v不在同一个连通分支中,就把(u,v)加入,由推论可知此边是安全的
- then A = AU{(u,v)}
- UNION(u,v)
- return A
FIND-SET(u)是找出u所在的连通分支。
Kruskal在全局中找权值最小的边,然后判断此边是否“合法”,进行取舍,直到遍历完所有的边。
Kruskal算法的运行时间为O(ElgV)。
2. Prim算法
- MST-PRIM(G, w, r)
- for each u∈V[G]
- do key[u]=∞
- π(u) = NIL // π(u)是u的前趋
- key[r] = 0
- Q=V[G]
- while Q != 空集
- do u=EXTRACT-MIN(Q)
- for each v∈Adj[u]
- do if v∈Q and w(u,v)<key[v]
- then π(v)=u
- key[v] = w(u,v) // 更新key[v]
Q是一个优先队列,key[v]是所有将v与树中某一顶点相连的边中的最小权值,若不存在这样的边,则k[v]=∞。
Prim算法在局部寻找权值小的的边(此边必合法),直到遍历完所有的节点。
Prim算法的运行时间为O(ElgV),与Kruskal算法渐近相等。
Prim算法实际上使用了与Dijkstra算法同样的策略,维护了一个权值数组key,在迭代过程中不断的更新。
《算法导论》学习总结 — XX.第23章 最小生成树的更多相关文章
- 算法导论学习---红黑树具体解释之插入(C语言实现)
前面我们学习二叉搜索树的时候发如今一些情况下其高度不是非常均匀,甚至有时候会退化成一条长链,所以我们引用一些"平衡"的二叉搜索树.红黑树就是一种"平衡"的二叉搜 ...
- 算法导论学习-Dynamic Programming
转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...
- 《算法导论》学习总结 — XX.第22章 图的基本算法
BFS(广搜): 广搜就是广度优先搜索,根据名字可以知道,是通过广度来遍历图,也就是层次遍历吧. 在这里以及下面的DFS(深搜),都用到了颜色WHITE,GRAY,BLACK,不过作用不同,具体分别再 ...
- 算法导论学习-RED-BLACK TREE
1. 红黑树(RED-BLACK TREE)引言: ------------------------------------- 红黑树(RBT)可以说是binary-search tree的非严格的平 ...
- 算法导论学习-prim算法
一. 关于最小生成树 对于无向连通图G=(V,E),其中V表示图的顶点,E表示图的边,对于每条边都有一个权值,可以理解为边a->b的权值C为从a走到b要走的路程为C.现在我们希望找到一个无回路的 ...
- 算法导论学习-binary search tree
1. 概念: Binary-search tree(BST)是一颗二叉树,每个树上的节点都有<=1个父亲节点,ROOT节点没有父亲节点.同时每个树上的节点都有[0,2]个孩子节点(left ch ...
- 算法导论学习-heapsort
heap的定义:如果数组a[1,....n]满足:a[i]>a[2*i] && a[i]>a[2*i+1],1<=i<=n/2,那么就是一个heap,而且是ma ...
- 算法导论学习之线性时间求第k小元素+堆思想求前k大元素
对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...
- 算法导论学习笔记1---排序算法(平台:gcc 4.6.7)
平台:Ubuntu 12.04/gcc 4.6.7 插入排序 #include<vector> #include <algorithm> #include<iostrea ...
随机推荐
- 使用nginx实现纯前端跨越
你是否厌倦了老是依赖后台去处理跨域,把握不了主动权 你是否想模仿某个app倒腾一个demo,却困于接口无法跨域 那么很幸运,接下来我将现实不依赖任何后台,随心所欲的想访问哪个域名就访问哪个! 下载ng ...
- Linux — 用户组、权限
Linux 用户组分为:所有者.所在组.其他组 所有者:谁创建,谁是所有者.命令:ls -al 所在组:当创建文件或者文件夹时,这个文件或者文件夹所分配到的用户组,这样就会有效地隔离文件. 其他组:和 ...
- Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署
写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...
- 关于selenium IDE找不到元素
selenium IDE ,明明存在元素,却找不到元素 ,报错Element not found 标签: seleniumselenium IDE自动化测试ide 2016-10-31 13:25 1 ...
- 在对话框中利用CToolBar类添加工具条的方法
UINT BASED_CODE DockTool[]={ID_NEWGAME,ID_SAVE,ID_OPEN,ID_SEPARATOR,ID_COPYFEN,ID_PASTEFEN,ID_SEPARA ...
- 第五次作业2、请将该code进行代码重构,使之模块化,并易于阅读和维护;
1.请运行下面code,指出其功能: (需附运行结果截图,并用简短文字描述其功能) 显示了人的姓名.年龄 2.请将该code进行代码重构,使之模块化,并易于阅读和维护: 3.观看视频The Exper ...
- 【Alpha】第七次Daily Scrum Meeting
GIT 一.今日站立式会议照片 二.会议内容 1.讨论送礼物的方法和对象,使功能更加完善. 2.对于程序还存在的问题提出自己的看法,尽量让功能更加的饱满. 三.燃尽图 四.遇到的困难 能 ...
- 201521123107 《Java程序设计》第13周学习总结
第13周-网络 1.本周学习总结 2.书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ...
- 201521123011《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. XMind 2. 书面作业 1.clone方法 1.1 O ...
- 201521123077 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 举个小栗子: 右侧的四个类都实现了同一个接口,所以可以让游戏类的引用指向实现类的实例,根据不同类型的实现类可以表现出不同的特性 ...