算法导论-复习笔记
《算法导论》读书笔记

哨兵(sentinel) 哨兵是一个哑对象,其作用是简化边界条件的处理。 类似于以前学习时讲到的头节点。加入哨兵将原来的双向链表转变成一个有哨兵的双向循环两表。L.nil代表哨兵。一图胜千言,如下:
如果有很多个很短的链表,慎用哨兵,因为哨兵所占用的额外存储空间会造成严重的存储浪费。哨兵并没有优化太多的渐进时间界,只是可 以使代码更紧凑简洁。 指针和对象的实现 对象的多数组表示: next和prev中的数字指的是对应数字的下标,有趣!
关于几个时间复杂度
通常情况下,当数据量足够大时,一般满足 θ(1)>θ(N)>θ(NlogN)>θ(N^2) (>代表优于)
1.算 法 基 础
1.1 插 入 排 序
时间复杂度:O(N^2) 思想:每次从右至左跟已排序数列进行对比,放入合适位置。两次遍历,一次相当于摸牌,另一次相当于具体的查找算法。
1.2 分 治 法
解决冲突的方法
链接法(chaining)
关于链接法采用双链的一些解释: 简单讲,删除就是从x对应的链表里删除x,双链表的删除加入哨兵只需两行,但是单链表的话只能指定x.next=null,但是在这之前需 要先将x.prev.next指向x.next,由于是单链,所以没有prev,只能一直next找下去,相比双链多了查找的时间耗费。
将问题分解为几个规模较小但类似于原问题的子问题,递归的求解这些子问题,然后再合并这些子问题的解来建立原问题的解。 (分解-解决-合并) 归并排序 时间复杂度O(NlogN)(O还是θ——theta,都差不多)
归并排序算法如下:
函数的增长
O渐进上界Ω渐进下界,o和ω 具体看数学定义最清楚。
分治策略
1. 维护堆的性质 通俗的讲,就是保持数组的最大堆性质。思路比较简单,比较parent节点和孩子节点,找到最大值,如果最大值是某个孩子节点,交 换,递归运行。对于树高为h的节点来说,该程序时间复杂度为O(h)
算法导论笔记

第一章算法在计算中的应用第九章中位数和顺序统计学9.1-11.将数组中的元素分组,每组两个元素,然后比较每组中的两个元素得到最小值,重新得到包含原来一半元素的数组,继续重复上述过程,那么最后一个元素必然为最小值。
如图所示,数组为{2, 1, 4, 3, 5}2.上述过程形成的是一个二叉树,其中叶子节点都为数组元素,非叶子节点刚好4个,这是二叉树的性质。
3.然后我们来找第二小元素,第二小元素必然跟着1,首先赋值为5,然后再赋值为3,然后赋值为2,即为所求。
【运行结果】:1.我们先将N个数配对,每两个数一对,每对之间进行互相比较得出小值。
2.对得出的N/2个元素重复第一步,直至得出最小值。
到这儿我们得出了最小值,实际上比较的次数为n-1次。
不难发现上面的过程实际上可以演示为一个二叉树。
例如在5,8,11,18四个数找出最小值,二叉树演示如下(每个节点相当于一次比较):观察二叉树,可以得出这样一个结论,所有与最小值比较过的数中的最小值纪即为第二小的的值。
二叉树的高度为lgn,因此与最小值比较的数的数目为lgn,在lgn个数中找出最小值要进行lgn-1次比较。
9.1-29.3节的方法可以在最坏情况下的线性复杂度的算法来求顺序统计量.其核心思想在于获得一个更好的中枢值来更好地划分数组.然而题中给了我们一个"黑盒子"来以线性复杂度获取一个真正好的中枢值,那么再好不过了。
在同时找到最大值和最小值时,每个元素都参与了与最大值和最小值的比较,比较了两次。
将数组成对处理。
两两互相比较,将大的与最大值比较,小的与最小值比较。
每两个元素需要的比较次数是,两两比较一次,大者与最大值比较一次,小者与最小值比较一次,共三次。
9.2-1长度为0的数组,RANDOMIZED-SELECT直接返回,当然不会递归调用。
9.2-29.2-3 写出RANDOMIZED-SELECT的一个迭代版本【算法思想】:递归:在函数中调用自身的程序过程。
算法导论小笔记

算法导论小笔记算法导论(CLRS)笔记Note on CLRS(Outline & Draft, 2011)Jian Xiao1第2章Getting started1. Merge sort相关的扩展问题1)链表实现V.S.数组实现。
Divide阶段,如何快速找到链表的中点?另外,如何减少Divide/Combine的时间(相比数组实现)?2)In-place merge的方法。
3)归并树:把Merge sort的中间过程都记录下来,所形成的树。
(其实就是一棵线段树,每个节点存放该节点的区间内有序化后的数)4)逆序数的计算。
2. 两数和问题。
数的集合S,一个数x,判断S中是否存在两个数,二者的和为x。
这个问题扩展以后是一个subset problem,为NPC问题。
第3章Growth of Functions1. 全部5个渐进符号的确切含义第4章Recurrences1. Substitution方法,Recursion tree方法计算复杂度2. Master Theorem及其不能被三种case覆盖的其他情况Master Theorem的证明3. Chip testing problem4. Monge arrays,凸四边形不等式,最优二叉查找树DP算法的优化第5章Probabilistic Analysis and Randomized Algorithms1. 用Biased-Random产生Uniform-Random分布。
2. In-place、O(n)的uniform random permutationIn-place、O(n)的各个position等概的排列1iamxiaojian@/doc/d1*******.html,3. Coupon collector’s problem4. On-line hiring problem第6章Heapsort1. 两种建堆的方法:逐个插入的O(nlogn),以及自底向上调整的O(n)算法2. Heap sort可能存在效率的地方:每次删除堆顶,都是把某树叶放置于堆顶,然后调整;但是,树叶一般比较大,放于堆顶后,几乎总是要进行多次的比较才能恢复堆的结构。
算法导论读书笔记

算法导论读书笔记【篇一:《算法概论》读书笔记及读后感】《算法概论》读书笔记12计转1 12130907 李酉辰第0章本章较为简短,没有深入系统地涉及某些内容。
主要以fibonacci 数列的例子,让我体会了递归和递推思想的差别。
针对fibonacci数列例子直接递归解法中涉及的重复计算,优化出递推方式,展示了思考问题中自顶向下与自底向上的不同思考角度可能产生较大的算法效率差别,同时隐约体现记忆化搜索的思想。
另外本章较为详细介绍了大o复杂度度量标准。
第1章本章以rsa算法为例,细致深入讨论了rsa算法涉及的相关数论知识,诸如取模运算、模下的四则运算与逆元概念、取模幂运算、素性检测。
在素性检测部分有经典的欧几里德算法、扩展欧几里德算法,同时引入随机化算法概念,以极高的概率保证素性检测有效性。
通过本章的学习,我对过去不曾深入考虑或者说真正考虑的基础性运算有了更深的理解。
之前对乘除运算复杂度总是在以单元操作的概念下以o(1)带过,以后会更加细致地考虑乘除等基本运算的复杂度。
另外,本章以rsa为案例,系统地展示了针对某一问题,如何从基础性知识入手,一步一步学习案例所需基础知识,并将其整合从而解决案例。
素性检测与素因子分解,两个看似相去不远的问题,其复杂性天差地别的现实,从一般角度让人们想到的是类似问题的解决难度可能差别很大仅此而已,而rsa算法展示了如何深入的多想一步,利用这种情况设计出优雅的解决方案。
这思想很值得我借鉴与利用。
第2章本章介绍分治算法思想,提及分治,相信每一个学习算法的人都不会陌生,经典的《算法导论》中就已合并排序为例在开篇不久就引入分治概念。
本书介绍分治的角度与众不同,不似《导论》中总是介绍比较显而易见的可以分治的案例。
本书列举了矩阵相乘、快速傅立叶变换等数学领域分治的应用案例,在这些案例之中,分治的应用很多情况下隐藏的较为深,并非显而易见,加大了分析难度。
但是更能让我感受到分治应用之广泛,可能在学习本章之前,许多类型的题目我不会想到去向分治的角度思考,因为不易看出,但是本章给我的备忘录上加了一条:永远不要忽视分治,针对陌生题目,不要轻易就否决掉往分治角度思考的路线。
算法导论(第三版)-复习-第六部分图论22-26[转]
![算法导论(第三版)-复习-第六部分图论22-26[转]](https://img.taocdn.com/s3/m/056830c148649b6648d7c1c708a1284ac85005ae.png)
算法导论(第三版)-复习-第六部分图论22-26[转]22习题22.1-5 有向图G(V, E)的平⽅图。
链表表⽰时,对每结点u的Adj[u]中所有v加⼊队列,后边出队边将Adj[v]加⼊Adj[u]中。
矩阵表⽰时,若w[i, j]、w[j, k]同时为1则将w[i, k]置1.习题22.1-6 O(V)的时间寻找通⽤汇点。
汇点的特征是邻接矩阵的第j列除[j, j]外所有元素为1. 可将每⾏调整[j ,j]后作为⼀个整数,所有整数与运算,为1的位是汇点。
习题22.1-7 有向⽆环图的关联矩阵B,BB’每个元素C[i, j]=∑B[i, k]*B’[k, j]=∑B[i, k]*B[j, k],即同时进i, j两结点与同时出i, j的结点总数-⼀进⼀出i, j两结点的结点总数。
习题22.2-7 类似BFS,d mod2为0则标为B(娃娃脸),d mod2为1则标为H(⾼跟鞋)。
但若有边连接相同类的结点,则⽆法划分。
wrestler(G){for each u in G{(u,v)=Adj[u];if(v.mark==u.mark){throw error;}if(v.d==NIL) {v.d=u.d+1; v.mark=v.d mod 2;}}}习题22.2-8 任意点之间的最短路径。
重复的Dijktra算法或Floyd-Warshall算法习题22.2-9 ⽆向图扩展为有向图。
问题变成要遍历所有边⼀次。
访问结点u时,将u的⼦结点v的其他边都可视为⼦集v,问题等价于u到v,访问v的集合,v到u。
u标为visiting⼊列,然后访问v,v标为visiting⼊列,然后访问v的后继结点,访问过的边标为visited,返回到visiting的点时,如果该点所有连接的边都标为visited只剩⼀条返回上级的边,则返回上级结点并将点标为visited,v出列,访问u的其他⼦结点,最终u出列。
全部结点出列后达到遍历所有边⼀次。
《算法导论》读书笔记 附录A习题解答

A.1-1求的简化公式。
利用等差级数求和公式和级数线性性质:
A.1-2利用调和级数性质证明。
利用调和级数性质:
A.1-3对,证明。
对无穷递减几何级数式两边求导,再乘以:
对该式再进行同上操作得到:
A.1-4 求。
A.1-5 求的值。
当时求得
当时:
计算得到:
A.1-6 利用求和公式的线性特征证明。
令,则下式显然成立:
再把函数代换回即可。
A.1-7 求的值。
A.1-8 求的值。
A.2-1 证明有常量上界。
A.2-2 求和的渐近上界。
故渐近上界是
A.2-3 通过分割求和证明第个调和数是。
故取得下界
A.2-4 通过积分求的近似值。
A.2-5 题略。
为了保证被积函数在积分域上都连续。
思考题
A-1 求和的界
求下列和式的渐近确界。
假设,都是常量。
a)
,得到确界为
b)
根据此式得到上界:
故得到下界:
故据此得到确界
c)
故得到上界:
故得到下界:
因此得到确界。
算法导论复习资料

算法导论复习资料一、选择题:第一章的概念、术语。
二、考点分析:1、复杂度的渐进表示,复杂度分析。
2、正确性证明。
考点:1)正确性分析(冒泡,归并,选择);2)复杂度分析(渐进表示O,Q,©,替换法证明,先猜想,然后给出递归方程)。
循环不变性的三个性质:1)初始化:它在循环的第一轮迭代开始之前,应该是正确的;2)保持:如果在循环的某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确;3)当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
插入排序算法:【INSERTION-SORT(A)1 for j ←2 to length[A]2 do key ←A[j]3 ▹Insert A[j] into the sorted sequence A[1,j - 1].4 i ←j - 15 while i > 0 and A[i] > key6 do A[i + 1] ←A[i]7 i ←i - 18 A[i + 1] ←key插入排序的正确性证明:课本11页。
》归并排序算法:课本17页及19页。
归并排序的正确性分析:课本20页。
3、分治法(基本步骤,复杂度分析)。
——许多问题都可以递归求解考点:快速排序,归并排序,渐进排序,例如:12球里面有一个坏球,怎样用最少的次数找出来。
(解:共有24种状态,至少称重3次可以找出不同的球)不是考点:线性时间选择,最接近点对,斯特拉算法求解。
解:基本步骤:一、分解:将原问题分解成一系列的子问题;二、解决:递归地解各子问题。
若子问题足够小,则直接求解;三、合并:将子问题的结果合并成原问题的解。
复杂度分析:分分治算法中的递归式是基于基本模式中的三个步骤的,T(n)为一个规模为n的运行时间,得到递归式、T(n)=Q(1) n<=cT(n)=aT(n/b)+D(n)+C(n) n>c附加习题:请给出一个运行时间为Q(nlgn)的算法,使之能在给定的一个由n个整数构成的集合S 和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
算法导论读书笔记

算法导论读书笔记第1章:算法在计算中的作用1.算法即是一系列的计算步骤,用来将一个有效的输入转换成一个有效的输出。
2.计算机的有限的资源必须被有效的利用,算法就是来解决这些问题的方法。
第2章:算法入门1、循环不变式的三个性质:(循环不变式通常用来证明递归的正确性)(1)初始化:它在循环的第一轮迭代开始之前,应该是正确的。
(2)保持:如果在循环的某一次迭代开始之前它是正确的,那么,在下一次迭代开始之前,它也应该保持正确。
(3)终止:当循环结束时,不变式给了我们一个有用的性质,它有助于表明算法是正确的。
2、分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些小问题,然后再合并其结果,就得到原问题的解。
3、分治模式在每一-层递归上都有三个步骤:(1)分解(Divde):将原问题分解成-系列子问题;(2)解决(Conquer):递归地解答各子问题。
若子问题足够小,则直接求解;(3)合并(Combine):将子问题的结果合并成原问题的解。
第3章:函数的增长1.对几个记号的大意:。
(非渐近紧确上界)≈<;0(渐近上界)≈≤;日(渐近紧界)≈=;2(渐近下界)≈≥;w(非渐近紧确下界)≈>;这里的<,s,=,2,>指的是规模上的比较,即o(n))的规模比g(n)小。
o(g())={f(n):对任意正常数C,存在常数n.>0,使对所有的n≥n,有0≤f(n)<cg(n)}O(g(n))={f(n):存在正常数c和n。
,使对所有n≥n。
,有0S(n)≤cg(n)}0(g(n)={f(n):存在正常数Cc.c和n。
,使对所有的n≥n,有0≤c,g(n)Sf(n)≤cg(n)}Q(g(n))={f(n):存在正常数c和n。
,使对所有n≥n,有0≤cg(n)Sf(n)}w(g())={f(n):对任意正常数c,存在常数n,>0.使对所有的n,有0≤cg(n)<f(n)}第4章:递归式1.递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《算法导论》复习笔记Chapter 22 基本图算法有向图邻接链表,计算节点出度和入度的时间复杂度O(V+E)开一个degree[]数组,大小为结点个数,复杂度O(V);遍历邻接链表,经过边uv时,计算出度degree[u]+=1,计算入度degree[v]+=1,复杂度O(E)将一个多图变成等价无向图,用邻接链表表示,时间复杂度O(V+E)多图是允许重复边和自循环边的图。
开一个bool数组mark[],大小为节点个数,初始化为false。
复杂度O(V)。
对每个顶点u的邻接链表,遍历,令v为u的边所指向的顶点;如果mark[v]=false,将uv加入新图,并将mark[v]设置为true;否则就跳过。
复杂度O(E)再次遍历u的连边,将mark[v]初始化整体复杂度O(V+E)伪代码:SOLVE(G,G’)1 for each vetex u∈G2 for each v∈ [u]3 if mark[v]==false4 mark[v]==true5 Addedge(G’,u,v)6 for each v∈[u]7 mark[v]=false图G的邻接矩阵表示,给出一个O(V)的算法来判断有向图G中是否存在一个通用汇点。
通用汇点指的是入度|V|-1,但出度为0。
等价问题:给定有向图G的V×V邻接矩阵G,在O(V)时间内判断是否存在一个数k,使得对所有的i有A[i][k]=1,对所有的j有A[k][j]=0,(i≠k,j≠k)令i和j初值为1,若G[i][j]=0,说明i到j无边,j不可能是通用汇点,令j=j+1;若G[i][j]=1,说明i 到j有边,i不可能是通用汇点,令i=i+1,循环直到i>|V|或者j>|V|;若i>|V|,则不存在通用汇点,若j>|V|,则检查顶点i是否满足要求。
伪代码:判断是否存在通用汇点 O(V)HAS_UNIVERSL_SINK(G)1 i=j=12 while i≤V and j≤V3 if G[i][j]==14 i=i+15 else j=j+16 if i>V7 return false8 else return CHECK(G,i)CHECK(G,u)1 for each vertex v∈2 if G[u][v]=13 return false4 for each vertex v ∈5 if G[v][u]==0& u!=v6 return false7 return true检查点u是否是通用汇点【宽度优先搜索】计算无向图BFS后的d值和π值简单,注意初始节点u的π值写NIL或者写-1输入如果是邻接矩阵表示的,BFS的运行时间O(V^2)对于队列中的每一个节点,都要遍历所有的节点来判断是否有边。
举例说明一个有向图G中可能存在这样一个边集Eπ:s到v的唯一简单路径也是一条最短路径,但是无论如何该边集Eπ都不能通过在图G上运行BFS获得。
V={1,2,3,4,5}, E={(1,2),(2,3),(1,4),(4,5),(2,5),(3,4)}, Eπ={(1,2),(2,3),(1,4),(4,5)}, s=1求一棵树T=(V,E)的直径,并分析算法的运行时间。
直径指的是树中所有最短路径的最大值。
两遍BFS就能解决.设v任意一点,BFS(v),令u=v能到达的最远点。
再BFS(u),取w为u能达到的最远点,则u 和w之间的最短路径就是直径。
时间复杂度是O(V+E)。
注意本题的证明。
反证法,设t1到t2是直径,u是v能达到的最远点,但是u不是t1或者t2中的一个,产生矛盾的结论。
【深度优先搜索】给出DFS每个结点的发现时间和完成时间,并给出每条边的分类用栈实现DFS,写出伪代码DFS-VISIT(G,u)1 (u)2 while(!3 u=4 if ==GRAY5 ==BLACK6 time=time+17 =time89 continue10 if ==WHITE11 =GRAY12 time=time+113 =time14 for each v∈G:Adj[u]15 if ==WHITE16 v.π=u17 (v)举出一个反例反驳:有向图G包含u到v的路径,并且DFS时<,则v是u在DFS森林中的一个后代。
V={w,u,v}E={(w,u),(u,w),(w,v)}有一条从u到v的路径,u->w->v,且d[u]<d[v]举出一个反例反驳:有向图G包含u到v的路径,则任意DFS都将导致≤。
例子同上为什么节点u同时有入边和出边,u还是深度优先树中的唯一节点V={w,u,v}E={(u,w),(v,u)}证明:在无向图上使用深度优先搜索来获取图G的连通分量,并且深度优先搜索包含的树的棵数与G的连通分量相同。
也就是说,修改深度优先搜索让每个结点赋予一个介于1和k之间的整数值,k是G的连通分量数。
相同连通分量中的点有相同的。
将DFS_VISIT(G,u)改成DFS_VISIT(G,u,++k),然后在该方法开头添加一句=k。
给出一个算法判断一个有向图是单连通图单连通:图G至多包含一条从u到v的简单路径。
判断是否出现了前向边或者横向边即可。
即分别对每个顶点进行DFS,记录过程中是否访问到黑色的节点。
时间复杂度(V*(V+E))伪代码:SOLVE(G)1 for each vertex u∈2 for each vertex v∈3 =WHITE4 v.π=NIL5 time=06 if(DFS(G,u))7 return false8 return trueDFS(G,u)1 time=time+12 =time3 =GRAY4 for each v∈G:Adj[u]5 if ==WHITE6 v.π=u7 if (DFS(G,v))8 return true9 if ==BLACK10 return true=BLACK12time=time+1=time14return false【拓扑排序】Compute the number of distinct paths from s to t in a directed acyclic graph(要求线性时间复杂度)为每个顶点声明数组dp[ ],dp[v]为s到v的路径数,初始化为0,dp[s]置为1。
进行拓扑排序,在拓扑排序的过程中,每到达一个节点u,其每个相连的节点v都将dp[v]加上dp[u]。
最后dp[t]就是s到t的路径数。
复杂度:O(V+E)给出一个算法来判断给定无向图G=(V,E)是否包含一个环路,复杂度O(V)DFS,访问当前节点的邻接表时,如果存在某个节点已经被标记为访问状态,而且该节点不是当前节点的父亲,则终止DFS,存在环路。
拓扑排序的另一种做法:重复寻找入度为0的结点,输出该结点,将该结点及其发出的边从图中删除。
请解释如何在O(V+E)的时间内实现这种思想。
如果图G包含环路,将会发生什么情况利用队列Queue。
邻接链表存储这个图G。
开一个大小为|V|的degree数组用来存储入度,遍历邻接链表,将各个点的入度存入degree数组中(复杂度O(E))。
从degree中取出入度为0的结点存入队列Q中,通过遍历数组实现(O(V))。
删掉入度为0的点,删除的过程中将该点引出的边也删掉,顺便检测有没有其他点因此变成了入度为0,将这些点加入队列中。
因此到最后所有的点都进过一次队列,复杂度O(V),每条边也都被处理了一遍,复杂度O(E)。
所以O(V+E)。
环路的入度不会为0,边不会被删掉,点不会加入拓扑序中。
给出一个算法判断图G是否是半连通的。
证明算法的正确性并分析运行时间。
对于有向图,任意节点对,存在u到v的路径或者v到u的路径。
这个题和拓扑排序的另一种做法有关。
对半连通图进行拓扑排序过程中,入度为0的点不能同时有2个或者以上。
否则,这两个入度为0的点之间就没有路径了。
因此就用中的算法,要求保持队列中最多只有1个点,如果多于1个就不是半连通的了。
思考题22-3 欧拉回路强连通有向图G=(V,E)中的一个欧拉回路是指一条遍历图G中每条边恰好一次的环路。
这条环路可以多次访问同一个结点。
a.证明:图G有一条欧拉回路当且仅当对于图中每个节点v,有in-degree(v)=out-degree(v)。
b.给出一个复杂度为O(E)的算法来找出图G的一条欧拉回路。
a.证明:=>若强连通有向图G有欧拉回路,则可知对于出发点s,假设有x次从s出,则最后回到s必须恰好有x次,因此对于s,出度和入度必然相等。
假设对于某个非出发点v,出度与入度不相等;假设出度y大于入度x,则第x次从v离开后再也不能回到v,剩余·的y-x条边不能被访问到;假设出度y小于入度x,则第y+1次进入v 后无法出去。
由此可知,对于非出发点v,入度与出度同样相等。
因此G有Euler回路则入度等于出度成立。
<=假设强连通图G的每个结点出度等于入度,则从出发点开始遍历,最终必然会回到出发点s。
因为如果最终没有回到出发点,会有一条s->v1->v2->…->vi的路径,其中vi不等于s,则遍历过程中进入vi的次数比从vi走出的次数多一次,这样就肯定有一条从vi出去的边没有被访问到。
所以不成立。
这样遍历一次后会形成一个子回路,再在这个子回路上某个不同于s点的s1点继续遍历,会形成一个以s1为起始点(也是终止点)的子回路,这两个回路没有公共边,而这两个子回路明显可以合并为一个回路,该回路为s->…->e->s1->f->…->s1->…->s, 这样不断扩展就必然形成一个欧拉回路。
b.从任意点开始DFS并在DFS过程中保存回路上的边。
DFS的复杂度是O(E)的。
设e为连通图G的某条环路上权重最大的边,证明:图G’=(V,E-{e})中存在一棵最小生成树,它也同时是G的最小生成树。
也就是说,G中存在一棵不包含边e的最小生成树。
证明:反证。
假设G中所有最小生成树都包含e。
任取一个这样的最小生成树T,在T上去掉e,将T分为两棵子树T1和T2,T1上顶点集合为V1,T2上顶点集合为V2,则(V1,V2)是一个割。
e所在的圈至少穿越割(V1,V2)两次,C至少有2条边在(V1,V2)中,其中一条边是e。
令e’为除了e之外的另外一条边,则w(e’)≤w(e)。
将e’并到T1和T2上,将T1和T2连接成一棵新的生成树T‘。
由于T’是在T上去掉e、加入e’后形成的,因此w(T’)≤w(T)。
因此,T’也是G的一棵最小生成树,且T‘中不包含e,与假设矛盾。